不理解原型链的set/get部分

来源:4-4 [JavaScript]get/set方法

小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创建的原型链属性会无法被赋值?

写回答 关注

2回答

  • 慕函数6472736
    2016-05-18 12:19:50
    已采纳
    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()在
    原型链中的特殊作用 ;
    
    或许不完全正确,供你参考吧


    小A_

    非常感谢!

    2016-05-19 07:18:31

    共 1 条回复 >

  • 一城一梦梦在指尖
    2016-06-30 19:08:53

    不知道还在不,借用楼上的例子,foo可以理解是obj的父对象,foo中的属性,obj都会拷贝到自己哪里,但这是拷贝的,所以有初值,所以修改obj.x的值不会影响到foo.x的值。这和值类型类似。

JavaScript深入浅出

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

281097 学习 · 1020 问题

查看课程

相似问题