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