【发布时间】:2018-08-20 17:33:08
【问题描述】:
我正在尝试执行以下操作:
function SomeFunctionConstructor() {
this.someMainVariable = "someValue";
this.manipulatePrototype = () => {
this.someProtoVariable = "some new value";
}
}
SomeFunctionConstructor.prototype.someProtoVariable = "Some proto value";
var someInstance = new SomeFunctionConstructor();
现在,如果我 console.log(someInstance),它会打印:
{
someMainVariable: 'someValue',
manipulatePrototype: [Function]
}
现在,当我执行someInstance.manipulatePrototype() 然后console.log(someInstance) 时,它会打印:
{
someMainVariable: 'someValue',
manipulatePrototype: [Function],
someProtoVariable: 'some new value'
}
为什么它直接在实例上创建一个新的someProtoVariable,而不是在原型上更新someProtoVariable? :(
【问题讨论】:
-
因为 JavaScript 对象属性分配总是这样工作的。它是语言设计的基本部分。如果它的工作方式不同,事情会很奇怪。
-
this中的操作原型与this之外的完全相同 -
@Pointy 嗯,据我所知,当我们访问对象上的属性时,它首先检查该对象上是否存在直接属性,如果没有,则在原型链中查找该属性.如果它在原型链中找到一个,它将对其进行操作,如果找不到,将直接在对象上创建一个新属性。不是吗?
-
嗯,你看到它发生在你正在使用的代码中,对吧?你的亲身经历还不够吗?它在语言规范中,但阅读起来非常复杂。
标签: javascript prototype ecmascript-5 function-constructor