更改原型(prototype)时,Javascript 对象丢失了构造函数

标签 javascript prototype

在下面的代码中

var A = function() {};
var a = new A();
var b = new A();

A.prototype = {};

var c = new A();
console.log(a.constructor === b.constructor);
console.log(a.constructor === c.constructor);

输出为 truefalse

我对错误输出很感兴趣。 ac 是使用 相同 构造函数创建的,即 A - 为什么它们的构造函数属性不同?看来我错过了什么。

附言。如果我删除我正在更改 A 输出原型(prototype)的行是:true true

最佳答案

当你构造一个对象时,构造函数的 prototype 属性被复制到新对象的 __proto__ 中,所以当 ab 保留旧原型(prototype)(其中还包含 .constructor 属性),c 使用新的空白原型(prototype)(不包含将 constructor 作为自己的属性)。这是一个图表:

a = new A 之后; b = 新 A:

enter image description here

A.prototype = {} 之后; c = new A()

enter image description here

如您所见,直接分配给原型(prototype)会破坏 JS 对象系统,并可能导致令人惊讶的结果(您的问题证明了这一点)。这就是它通常不受欢迎的原因。

关于更改原型(prototype)时,Javascript 对象丢失了构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41034569/

相关文章:

javascript - 如何使用 javascript 构造函数创建一个 html 元素?

javascript - 将 indexOf 结果与 -1、 "!="或 ">"进行比较时,首选运算符是什么?

javascript - 如何自引用 NodeJS 模块?

javascript - 在javascript中将转义文本转换为html?

JavaScript 无分号代码样式和缩小?

javascript - jQuery 根本没有加载

javascript - 当使用 apply() 和 call() 方法很容易继承时,为什么人们在 JavaScript 中使用原型(prototype)?

javascript - 使用 Node.js 在其他文件中使用原型(prototype)

javascript - 如何使 JavaScript 对象的原型(prototype)永久化?

javascript - 无法使用 "class"方法在 JavaScript 中进行回调