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

时间:2016-12-08 08:04:31

标签: 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 - 为什么它们的构造函数属性不同?我好像错过了什么。

PS。如果我删除我正在更改A输出原型的行是:true true

2 个答案:

答案 0 :(得分:3)

问题在于,当您使用A.prototype={}时,它会更改A对象的行为。

使用A.prototype={}时,对象丢失了constructor

  

为什么会出现这种情况?

constructor属性已分配给prototype功能。

在您的情况下,A.prototype将替换为新的对象{},该对象没有constructor属性作为自己的属性(但其原型具有并等于{{ 1}})。

让我们看看以下示例:

Object

之前(2)

function A() { } // (1)
A.prototype = {}  // (2)

之后(2)

Object.prototype
{
    constructor:Object
}

A.prototype
//was autocreated with A
{
    constructor:A
}

答案 1 :(得分:0)

将函数用作对象构造函数时,它的prototype.constructor是使用函数的属性自动创建的。因此,最初在设置A函数之后,您将在A的原型中拥有一个构造函数:

A.prototype.constructor

因此,当您分配A.prototype = {}时,您就失去了A.prototype中的原始构造函数。

您可以通过在A.prototype ={}行之后添加此内容来解决此问题

A.prototype.constructor = A;

两个控制台均应记录为真