use*_*800 6 javascript inheritance
我已经盯着这个答案一段时间了,我无法绕过它:https://stackoverflow.com/a/23699009/3658800.
总结一下:
只有属性读取搜索原型链,而不是写入.所以当你设置
myObject.prop = '123';
Run Code Online (Sandbox Code Playgroud)
它不会查找链条,但是当你设置时
myObject.myThing.prop = '123';
Run Code Online (Sandbox Code Playgroud)
在写入操作中有一个微妙的读取,试图在写入其prop之前查找myThing.这就是为什么从子节点写入object.properties会获取父节点的对象.
我基本上要求有人详细说明这种"微妙的阅读"操作.首先评估myObject.myThing,返回对myThing对象的引用(然后设置其"prop"属性)?是否有一些我可以证实这一点的来源(Mozilla,Javascript源代码等)?
小智 4
该写入操作中正在进行微妙的读取,尝试在写入其 prop 之前查找 myThing。这就是为什么从子级写入 object.properties 会获取父级的对象。
这不是一个“微妙”的读物。这是一本常规读物。
obj.prop1.prop2 = "foo"
Run Code Online (Sandbox Code Playgroud)
被解释为(obj.prop1).prop2 = "foo". 假设虚数read和write原语,它的执行方式为
write(
read(obj, 'prop1'),
'prop2',
"foo")
Run Code Online (Sandbox Code Playgroud)
如果这样更清楚的话。换句话说,首先,prop1是从读取obj的。按照正常的读取方式查阅原型链。如果不是在实例上找到,而是在原型链上找到,那么结果就是prop1原型上的。
接下来,对由 产生的对象prop2进行设置obj.prop1。如果这恰好是prop1原型上的,则在原型上prop2设置属性。prop1如果prop1在实例上找到,则在实例上prop2设置属性。prop1
这里的基本原则没有改变,即读取参考原型链,写入始终针对正在写入的对象(不参考原型链)。
请注意,在原型上存在 setter 和 getter 的情况下,此行为可能存在细微差别。
为了避免让自己和他人感到困惑,最好避免在原型上保留数据。将原型视为排他地或主要地共享基于该原型创建的对象的方法的一种方式。理想情况下,使用原型来保存数据应仅限于在实例之间共享的真正恒定的数据。