Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何截取使用文字符号创建的未知对象的已知属性值赋值_Javascript_Object_Monkeypatching - Fatal编程技术网

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