什么是实际使用的对象的`.constructor`属性

时间:2014-04-20 19:34:51

标签: javascript inheritance constructor

我一直在使用这样的代码继承另一个对象:

// 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运算符的正常构造中使用。我想知道它何时被使用?

1 个答案:

答案 0 :(得分:1)

根据ECMAScript Language Specification

  

Object.prototype.constructor的初始值是标准的内置Object构造函数。

换句话说,它只是指向Object的实际本机构造函数的指针 - 通过new Object()调用的构造函数。因此,您可以覆盖它而无需更改有关新Object()如何工作的任何内容。

为什么它存在?因为构造函数在JavaScript中是有效的类,所以它允许您使用类实例执行某些操作而无需其类名。要从Axel Rauschmayer's blog借用,构造函数属性允许:

  • 比较类,即a.constructor === b.constructor
  • 从现有实例创建新实例,即new a.constructor()
  • 调用另一个(超级)类的构造函数

所有没有任何对类名的硬编码引用。再说一遍,它并不意味着被覆盖。为了回应上述评论,我从未真正看到有人在野外覆盖它。