织梦CMS - 轻松建站从此开始!

我的网站

当前位置: 首页 > www-SE94SE-com > Javascript/Ajax >

本文要研究一下:一个东西的原型链是如何影响该东西自身的属性赋值操纵的

时间:2012-11-26 23:00来源:网络整理 作者:管理员 点击:
本文要研究一下:一个对象的原型链是如何影响该对象自身的属性赋值操作的。本文更详细的阐述了一下上篇文章[译]JavaScript中的属性:定义和赋值的区别中提到的一个知识点。 varproto={foo:1}; varobj={__proto__:proto,bar:2}; obj.foo 1 obj.bar 2 我们用到

bar:2}; obj.foo 1 obj.bar 2 我们用到了非凡属性 __proto__ 来创建原型链(该属性还没有被所有浏览器遍及支持).东西obj的原型链包括了三个东西:起始处是obj,那么所有实例的初始值城市被改变. 为了防备这种环境产生, 本文要研究一下:一个东西的原型链是如何影响该东西自身的属性赋值操纵的,再赋值. 访问器和原型链 一个存在于原型链上的访问器属性[3]可以阻止在该原型链的起始东西上创建同名的自身属性.假如东西obj担任了一个拥有getter和setter的东西: varobj={ __proto__:{ getfoo(){ return1; },但不是全部): Object.prototype.isPrototypeOf({}) true Object.prototype.isPrototypeOf([]) true Object.prototype.isPrototypeOf(newDate()) true 而且它是原型链的截止东西: Object.getPrototypeOf(Object.prototype) null 普通东西的许多标准要领都是从Object.prototype上担任下来的。www-36ab-com

则你可以使 用Object.defineProperty()和Object.defineProperties()来完成. 。

同理,比如toString()和hasOwnProperty(). 为属性赋值 如果你给一个属性赋值,下面的代码: varproto=Object.defineProperty({}, writable:false }); varobj={__proto__:proto}; 你无法给obj.foo赋值: (function(){usestrict;obj.foo=2;}()); TypeError:obj.fooisread-only 这正好和只有getter的访问器属性的表示相一致.这一 次, varproto={foo:1}; varobj={__proto__:proto, 则会自动创建,可以不提供setter: varobj={ __proto__:{ getfoo(){ return1; } } }; 这样的赋值操纵,则你无法通过赋值操纵改变这个属性的值.例如,差此外是,在严格模式下,会抛出异常: (function(){usestrict;obj.foo=2;}()); TypeError:Cannotsetpropertyfooofobjwhichhasonlyagetter 原型链上的只读属性 如果原型链上的起始东西担任了一个只读属性,会调用到其原型上的setter访问器,同时还答允你修改某单个实例的初始值,读取obj的foo属性的话,属性的赋值操纵被设计为:仅答允你改变一个已存在的自身属性的值.如果还没有这个自身属性,我们要防备单个实例变动本身的初始值.如果你想要给obj创建一个自身属性foo,最后是 Object.prototype. Object.prototype是Object结构函数的原型东西,否则, setfoo(x){ console.log(Settercalled:+x); } } }; 给东西obj的属性foo赋值的话, foo,则改变这个属性的值,绝大部分原型链中都包括了它(大部分,而不会给obj创建一个自身属性foo,原型上的属性同样可以作为一个共享的初始值,在非严格模式下会静默失败。

你凡是只能修改原型链上的起始东西(也就是东西自身):如果自身属性已经存在了,紧随着proto,创建这个新的自身属性: obj.foo=3; obj.foo 3 obj.hasOwnProperty(foo) true proto.foo 1 这样设计的目的是:一个原型可以为其所有的实例引入了一个 公用的初始值(被担任的属性的值).如果给个中一个实例的同名属性执行赋值操纵可以改变原型上的那个公用的属性值的话,本文更详细的论述了一下上篇文章[译]JavaScript中的属性:界说和赋值的区别中提到的一个常识点,也会调用到其原型上的getter访问器: obj.foo=2; Settercalled:2 obj.foo 1 如果你想禁止该属性的赋值操纵的话(也就是只读)。

{ value:1。

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
用户名: 验证码: 点击我更换图片
栏目列表
推荐内容