Javascript 如何截取使用文字符号创建的未知对象的已知属性值赋值
这个问题是我在这里提出的另一个问题的延续: 这是一种用于截取某个名称的任何对象属性的方法,目的是在分配或读取该属性时更改该值或执行某个操作:Javascript 如何截取使用文字符号创建的未知对象的已知属性值赋值,javascript,object,monkeypatching,Javascript,Object,Monkeypatching,这个问题是我在这里提出的另一个问题的延续: 这是一种用于截取某个名称的任何对象属性的方法,目的是在分配或读取该属性时更改该值或执行某个操作: Object.defineProperty(Object.prototype,“我的财产”{ 设置:函数(值){ 此值为._值=值; }, get:function(){ 返回“已更改”; } }); var some_object={}; some_object.my_property=“未更改”; document.body.innerHTML+=某
Object.defineProperty(Object.prototype,“我的财产”{
设置:函数(值){
此值为._值=值;
},
get:function(){
返回“已更改”;
}
});
var some_object={};
some_object.my_property=“未更改”;
document.body.innerHTML+=某个_object.my_属性代码>
我的属性值是:
据我所知,无法实现您所期望的效果。带有=
的赋值将使对象通过原型链,并在对象原型上使用get
方法。但是,文字赋值将直接将其放置在新对象上。这是Javascript的规则。要了解更多信息,我建议阅读《你不知道JS》,这是《对象原型》,第5章,特别是本节
相关部分:
现在我们将研究myObject.foo=“bar”的三种场景
当foo尚未直接位于myObject上,但位于
myObject的[[Prototype]]链的更高级别:
如果找到名为foo的普通数据访问器(参见第3章)属性
在[[Prototype]]链上较高的任何位置,并且未标记为
只读(writable:false),然后添加一个名为foo的新属性
直接指向myObject,生成阴影属性
如果一个foo是
在[[Prototype]]链的更高位置找到,但它被标记为只读
(writable:false),则现有属性的设置
以及在myObject上创建阴影属性
不允许。如果代码在严格模式下运行,则会出现错误
扔。否则,属性值的设置将以静默方式进行
忽略。无论哪种方式,都不会出现阴影
如果在上找到更高的foo
[[Prototype]]链,它是一个setter(参见第3章),然后
setter将始终被调用。没有foo将被添加到(aka,shadowed)
在)myObject上,也不会重新定义foo setter。大多数开发者
假设一个属性([[Put]])的赋值总是导致
如果[[Prototype]]上的属性已经存在,则进行阴影处理
链,但正如你所见,这只适用于三个链中的一个(#1)
刚才描述的情况
如果要在第2和第3种情况下对foo进行阴影处理,则不能使用=
赋值,但必须改为使用Object.defineProperty(..)(请参阅
第3章)将foo添加到myObject
我知道没有办法达到你想要的效果。带有=
的赋值将使对象通过原型链,并在对象原型上使用get
方法。但是,文字赋值将直接将其放置在新对象上。这是Javascript的规则。要了解更多信息,我建议阅读《你不知道JS》,这是《对象原型》,第5章,特别是本节
相关部分:
现在我们将研究myObject.foo=“bar”的三种场景
当foo尚未直接位于myObject上,但位于
myObject的[[Prototype]]链的更高级别:
如果找到名为foo的普通数据访问器(参见第3章)属性
在[[Prototype]]链上较高的任何位置,并且未标记为
只读(writable:false),然后添加一个名为foo的新属性
直接指向myObject,生成阴影属性
如果一个foo是
在[[Prototype]]链的更高位置找到,但它被标记为只读
(writable:false),则现有属性的设置
以及在myObject上创建阴影属性
不允许。如果代码在严格模式下运行,则会出现错误
扔。否则,属性值的设置将以静默方式进行
忽略。无论哪种方式,都不会出现阴影
如果在上找到更高的foo
[[Prototype]]链,它是一个setter(参见第3章),然后
setter将始终被调用。没有foo将被添加到(aka,shadowed)
在)myObject上,也不会重新定义foo setter。大多数开发者
假设一个属性([[Put]])的赋值总是导致
如果[[Prototype]]上的属性已经存在,则进行阴影处理
链,但正如你所见,这只适用于三个链中的一个(#1)
刚才描述的情况
如果要在第2和第3种情况下对foo进行阴影处理,则不能使用=
赋值,但必须改为使用Object.defineProperty(..)(请参阅
第3章)将foo添加到myObject