var person = { name : 'jim', address:{ province:'浙', city:'A' } } var newPerson = Object.create(person);
console.log(newPerson.name)//jim newPerson.name ='jack'; newPerson.address.province = '滬'; console.log(person.name, person.address.province) //jim,滬
緣起上面一段代碼,結果出來感受疑惑了。spa
緣由是Object.create出來的newPerson實際上是一個空對象,原型是person。指針
newPerson.name賦值或者讀值的時候會首先去person中去找,若是有name屬性。則返回原型person.namecode
若是沒有則從新賦值。對象
按照這個思路解釋的時候,看官就感受奇怪了,那newPerson.address.province這個值賦值的的時候也是newPerson的不是person的啊。blog
這個就涉及到基本類型和引用類型的區別了。內存
基本類型(Undefined、null、Boolean、Number、String)在內存中佔據固定的內存大小,所以被保存在棧內存中,從一個變量像另外一個變量複製基本類型的的值,會建立這個值的副本。newPerson.name是person.name的個副本。ci
引用類型(Object、Array、Date、RegExp、Function)的值是對象,保存在堆內存中,包含引用類型的值的變量實際上包含的並非對象自己,而是一個指向該對象的指針。原型
一個變量向另外一個變量複製引用類型的值,其實複製的是指針,所以兩個變量指向同一個對象。所以在create一個 仍是指向person的對象。it