我一直在尝试使用JavaScript享誉世界的原型继承实现。到目前为止,除了一件事之外,一切对我来说都是有意义的...
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 - 新的x()。constructor实际不存在吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31887414/