javascript - new x().constructor 实际上并不存在?

标签 javascript prototype

我一直在试验 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.constructorderivedObj .那么它的作用是遵循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/

相关文章:

javascript - 如何对 API 调用进行单元测试并断言 React 和 Enzyme 中的状态更改?

javascript - 多字节字符占用的字符数在 JavaScript 和 MySQL 中是不同的

javascript - webpack - 如何停止加载程序运行两次?

c - 冒泡排序 C 语言帮助。来自源代码的基于行的问题

javascript - Canvas - 从原型(prototype)中绘制图像

javascript - 为什么 a.y 在这里未定义?

javascript - 使用 jquery html() 将脚本插入到新窗口

c - 使用emacs获取函数原型(prototype)

JavaScript:如何从原型(prototype)属性上的另一个函数调用原型(prototype)属性上的函数,所有这些都在闭包内?

javascript - node js退出状态8,错误代码0在mac上运行