为了账号安全,请及时绑定邮箱和手机立即绑定

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

我在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 回答

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()在
原型链中的特殊作用 ;

或许不完全正确,供你参考吧


6 回复 有任何疑惑可以回复我~
#1

小A_ 提问者

非常感谢!
2016-05-19 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript深入浅出
  • 参与学习       281102    人
  • 解答问题       1020    个

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

进入课程

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信