小A_
2016-05-18 09:39
我在IDE尝试的时候,试了这样的方式,发现是可以直接改原型链的值?
var foo = {}
foo.x = 1
var obj = Object.create(foo)
console.log("inherit from foo"+obj.hasOwnProperty('x')) //false,所以说明obj遗传了foo的x
console.log(obj.x)//1
obj.x = 2//照理说这样是没办法改变foo的值?
console.log(obj.x)//可是变成了2
我的问题是,那是不是只有用defineProperty创建的原型链属性会无法被赋值?
var foo = {}; foo.x = 1; var obj = Object.create(foo); obj.x = 2; //这里能给予赋值是很正确的,可以通俗理解为obj和foo都是普通对象,普通对象当然能给自己添加属性赋值 //只是obj这个家伙偷懒‘引用’了foo的属性。但不影响obj有权利随意给自己添加属性不受你foo的限制, //所以obj.x可以随意赋值,但注意其实这没有改变foo.x的值 var foo = {}; Object.defineProperty(foo,'x',{value:1}); var obj = Object.create(foo); //这里就不一样了,Object.defineProperty()就是皇上的圣旨,给了foo特权,这个特权就是obj必须服从 //foo的指挥,只要foo说x是什么样子,那obj的x就是什么样子,所以这里不管obj.x赋值是多少对不起你都 //和foo.x的值一样; //obj.x想要翻身当主人怎么办? 当然还是需要Object.defineProperty()给的圣旨才行; Object.defineProperty(obj,'x',{value:2}); 在这个画面的前2分钟讲了set/get会改变原型链访问的方式,里面有提及Object.defineProperty()在 原型链中的特殊作用 ; 或许不完全正确,供你参考吧
不知道还在不,借用楼上的例子,foo可以理解是obj的父对象,foo中的属性,obj都会拷贝到自己哪里,但这是拷贝的,所以有初值,所以修改obj.x的值不会影响到foo.x的值。这和值类型类似。
JavaScript深入浅出
281097 学习 · 1020 问题
相似问题