有人可以向我解释一下这种行为。
首先让我们使用构造函数创建一个构造函数和一个新对象:
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
继承了构造函数字段。
答案 0 :(得分:3)
每个Function
对象都有一个prototype
属性,其“构造函数”属性引用该函数。使用Object文字语法创建新原型时,会创建一个全新的对象,其构造函数实际上是Object
函数。您需要显式设置构造函数属性:
function MyConstructor2() {
}
MyConstructor2.prototype = {
constructor: MyConstructor2
};