我一直在使用这样的代码继承另一个对象:
// define base object constructor
function SuperType(){
// constructor code
}
// define base object methods on the prototype
SuperType.prototype.foo = function() {};
// ---------------------------------------------------------------------------
// define object that wants to inherit from the SuperType object
function SubType() {
// call base object constructor with all arguments that might have been passed
SuperType.apply(this, arguments);
// other constructor code
}
// set prototype for this object to point to base object
// so we inherit any items set on the base object's prototype
SubType.prototype = new SuperType();
// reset constructor to point to this object not to SuperType
SubType.prototype.constructor = SubType;
// define any methods of this object by adding them to the prototype
SubType.prototype.myMethod = function() {};
我的问题是你为什么要设置SubType.constructor = SubType
?实际使用的.constructor
属性是什么时候?如果您创建这样的SubType
对象:
var s = new SubType();
无论SubType()
实际设置的是什么,都会调用SubType.prototype.constructor
构造函数,因此我试图了解.constructor
属性何时实际上用过?
正如您在this jsFiddle demo中看到.constructor
的赋值已注释掉的那样,仍会调用正确的构造函数。因此,似乎.constructor
属性未在new
运算符的正常构造中使用。我想知道它何时被使用?
答案 0 :(得分:1)
根据ECMAScript Language Specification,
Object.prototype.constructor的初始值是标准的内置Object构造函数。
换句话说,它只是指向Object的实际本机构造函数的指针 - 通过new Object()调用的构造函数。因此,您可以覆盖它而无需更改有关新Object()如何工作的任何内容。
为什么它存在?因为构造函数在JavaScript中是有效的类,所以它允许您使用类实例执行某些操作而无需其类名。要从Axel Rauschmayer's blog借用,构造函数属性允许:
所有没有任何对类名的硬编码引用。再说一遍,它并不意味着被覆盖。为了回应上述评论,我从未真正看到有人在野外覆盖它。