我一直在试验 JavaScript 举世闻名的原型(prototype)继承实现。到目前为止,除了一件事之外,一切对我来说都是有意义的......
function base() {
this.a = "baseObj property";
}
base.thisIs = "base constructor";
function derived() {
this.b = "derivedObj property";
}
derived.thisIs = "derived constructor";
var baseObj = new base();
到目前为止一切顺利。 baseObj.a
返回 “baseObj 属性” 和 baseObj.constructor.thisIs
返回 “基础构造函数”。
但是当我实际让某些东西继承基础对象的值时,事情开始让我感到困惑。
derived.prototype = baseObj;
derivedObj = new derived();
最终发生的是 derivedObj.a
返回 “baseObj 属性”。好的。 derivedObj.b
返回 “derivedObj 属性”。又好了。但是derivedObj.constructor.thisIs
返回 “基础构造函数”...
要发生这种情况,解释器必须找不到 derivedObj.constructor
在derivedObj
.那么它的作用是遵循derivedObj.__proto__
吗?去那里搜索。因为new
关键字集 derivedObj.__proto__
等于 derived.prototype
,我们之前设置为等于 baseObj
, derivedObj.__proto__
最终返回 baseObj
.
这可以解释为什么 derivedObj.constructor
已经忘记了。貌似没什么用解释器不需要使用它来获取 derived.prototype
;他们可以使用 derivedObj.__proto__
.然而,现实情况是,使用 derivedObj.constructor
可以 有用。为了获得derived.thisIs
的值.
但即便如此。它没有解释为什么它没有在baseObj
中被遗忘.为什么 .constructor
存在于 baseObj
内但不是 derivedObj
?它们的初始化方式完全相同。随着new
关键字。
最佳答案
默认情况下,函数有一个prototype
属性,当函数用作构造函数时,它是实例从中继承的对象。 prototype
对象有一个 constructor
属性,它指向函数。
derived.prototype = baseObj
的问题是你替换了整个prototype
,所以你失去了原来的derived.prototype.constructor
,它返回 derived
。
解决它的方法是重新分配该属性:
derived.prototype = baseObj;
derived.prototype.constructor = derived;
但是,这会改变 baseObj
对象。这通常是不希望的,所以正确的方法是
derived.prototype = Object.create(baseObj);
derived.prototype.constructor = derived;
关于javascript - new x().constructor 实际上并不存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31887414/