构造函数的奇怪行为

时间:2016-04-27 12:17:05

标签: javascript

有人可以向我解释一下这种行为。

首先让我们使用构造函数创建一个构造函数和一个新对象:

var MyConstructor = function() {};
var obj = new MyConstructor();

一切都如预期:

console.log(obj.constructor === MyConstructor); //true
console.log(obj.__proto__ === MyConstructor.prototype); //true

让我们再试一次,但这一次让我们在构造函数中添加一个自定义原型:

var MyConstructor2 = function() {};
var myProto = { fld: 'val' };
MyConstructor2.prototype = myProto;
var obj2 = new MyConstructor2();

现在事情并不像我预期的那样:

console.log(obj2.constructor === MyConstructor2); //false?!?!
console.log(obj2.constructor === Object); //true, b-but i didnt use Object..
console.log(obj2.__proto__ === MyConstructor2.prototype); //true

为什么obj2.constructor引用Object而非MyConstructor2

--- edit1 ---

只是澄清一下。如果您创建一个新功能:

var MyConstructor = function() {};

然后Javascript实现也会创建一个新对象:

var temp = { constructor: MyConstructor };

并将其设置为:

MyConstructor.prototype = temp;

此处需要注意的是,临时对象会覆盖constructor的{​​{1}}字段(默认为Object.prototype)。

所以当我使用构造函数创建一个新对象时:

Object.prototype.constructor === Object

然后该对象继承指向var obj = new MyConstructor(); 的构造函数字段。在第二种情况下没有覆盖,因此第二个对象直接从MyConstructor继承了构造函数字段。

1 个答案:

答案 0 :(得分:3)

每个Function对象都有一个prototype属性,其“构造函数”属性引用该函数。使用Object文字语法创建新原型时,会创建一个全新的对象,其构造函数实际上是Object函数。您需要显式设置构造函数属性:

function MyConstructor2() {

}

MyConstructor2.prototype = {
    constructor: MyConstructor2
};