Javascript中的构造函数属性是否有一个很好的用例?

Mik*_*sen 5 javascript prototype-programming

首先,这个问题不是 "构造函数属性做什么?" - 有很多关于它究竟是什么以及如何工作的良好文档:它是对创建对象的函数的引用(可以从其原型继承).

我更了解这个属性的常见用例.理论上它似乎都很好,但是什么时候你真的需要引用构造你的对象的函数?一些想法是:

  • 也许我想要克隆它.我可以再次调用构造函数并
    获取我的对象的另一个实例.这当然不会很好,因为您可能正在创建对象
    原型的实例,而不是对象本身; 加上一个更受欢迎的方法是创建一个新对象并设置该对象的原型.
  • 也许你可以用它来弄清楚对象的"类型"是什么.这似乎很奇怪,因为你可以使用instanceofObject.prototype.toString()代替.
  • 你能改变或重新分配构造函数吗?有没有充分的理由这样做?

希望有些人可以使用构造函数引用的一些好的Javascript模式,或者提供有关属性存在的官方解释.

Rob*_*obG 4

构造函数属性很方便(或者如果它可靠的话)的一种情况是函数需要知道它所传递的参数的类型,例如

function foo(arg) {
  if ( /* if arg is an array */ ) {
    // deal with array
  } else if ( /* if arg is an object */ ) {
    // deal with object
  }
}
Run Code Online (Sandbox Code Playgroud)

如果上面的函数传递一个数组或对象,那么在两种情况下都typeof将返回对象。可以使用构造函数属性:

  if ( arg.constructor == Array )
Run Code Online (Sandbox Code Playgroud)

但是,如果数组是在与测试发生位置不同的框架中创建的(即,它的数组构造函数是测试范围内的数组函数的不同对象),则会失败。

因此,如果您排除框架(或范围存在问题的其他情况),那么构造函数属性就可以很好地用于此目的。

但这并不能解决构造函数属性可写(因此可以设置为任何内容)以及原型链非常简单的情况的一般问题。