Javascript 对象的`.constructor`属性何时实际使用

Javascript 对象的`.constructor`属性何时实际使用,javascript,inheritance,constructor,Javascript,Inheritance,Constructor,我一直在使用这样的代码从另一个对象继承: // define base object constructor function SuperType(){ // constructor code } // define base object methods on the prototype SuperType.prototype.foo = function() {}; // ------------------------------------------------------

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

// 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
属性何时实际使用?如果像这样创建
子类型
对象:

var s = new SubType();
这将调用
子类型()
构造函数,而不管
子类型.prototype.constructor
实际设置为什么,因此我试图了解
.constructor
属性何时实际使用过


正如您在中看到的那样,注释掉了
.constructor
的赋值,仍然调用了正确的构造函数。因此,
.constructor
属性似乎没有在使用
新的
运算符的正常构造中使用。我想知道它是什么时候用的?

根据

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

换句话说,它只是指向对象的实际本机构造函数的指针——通过new Object()调用的构造函数。因此,您可以重写它,而无需更改有关new Object()工作方式的任何内容

那么它为什么存在呢?因为构造函数实际上是JavaScript中的类,所以它允许您使用类实例执行某些操作,而无需输入它们的类名。要从中借用,构造函数属性允许:

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

都没有对类名的任何硬编码引用。再说一次,它并不是真的要被覆盖。与上面的评论相呼应,我从未真正看到有人在野外覆盖它。

我从未见过它被用于任何有用的东西,只能猜测它是instanceof的必然结果(这也是相当无用的)。@RobG-Hmmm,我想也许你发现了什么,但是
instanceof
似乎并不依赖于
.constructor
是否正确设置:。我也从未见过它在任何地方使用过。也许有一些第三方库使用它(他们可能不应该这么做),但我不认为语言本身有什么东西依赖于它。它可能只是为了向最终用户公开有关构造函数的信息。@basilikum-这就是我开始思考的-不是真正需要或使用的,如果有人使用过它,这个问题可以通过另一种方式轻松解决。在某一点上,我认为它可能存在,这样你就可以知道如何任意创建一个相同类型的新对象(不需要通过执行
new obj.constructor()
)就知道该类型),但即使这样,也只有当你对对象的类型有足够的了解才能“知道”构造器不需要参数,或者您知道需要哪些参数,在这种情况下,您可能已经知道了足够的知识来创建所需的对象。我想有些用例可能是有意义的,但可能要由您来找到/创建它们。你只需要知道,如果你不能完全控制你的输入数据,你就不能依赖这个属性。无论如何,如果设置不正确,很可能不会损坏任何东西。