Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

原型链中的访问器属性

  普通数据属性的继承规则我们已经再熟悉不过了,但访问器属性则不同,因为它是调用其它函数。如果一个对象的原型链中包含的是属性访问器,那直接在对象上操作属性也不会影响到对象本身的属性,只会把相关的参数传到属性访问器上,并以调用对象作为this而已。
  实际上在浏览器自带的对象中就有这么用的例子,比如__proto__。ES5中规定了普通对象初始化时候必须不带任何属性,所以__proto__也不可能是直接设置在对象上的。它是继承而来的,我们可以从Object.prototype中找到它,而且它就是一个访问器属性。
Object.getOwnPropertyDescriptor(Object.prototype,"__proto__");
  当我们给__proto__赋值时实际上是调用了Object.prototype上的__proto__,只是this被绑定为了我们的操作对象。
<script>
var o=Object.create({set n(e){
  console.log([this,e]);
}});
o.n="test";
console.log(o.hasOwnProperty("n"));
</script>

  只要原型链中存在访问器属性,我们在对象的属性上赋值就不会直接作用到对象上。当我们需要保护一个对象的某个属性不受直接操作的影响时就可以在原型链中加入访问器属性。虽然使用Object.preventExtensions也可以实现类似的效果,但这个方法是针对整个对象的,无法只对特定属性起作用,而且无法还原。所以,把访问器属性放在原型链中的做法在特定场景下还是很适用的。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^