在"JavaScript 5版权威指南“(第9.2节原型和继承)一书中,我发现了以下几个词:
在上一节中,我展示了新操作符创建一个新的空对象,然后调用构造函数作为该对象的方法。然而,这并不是完整的故事。在创建空对象之后,new设置该对象的原型。对象的原型是其构造函数的prototype属性的值。所有函数都有一个prototype属性,该属性在定义函数时自动创建和初始化。原型属性的初始值是一个具有单个属性的对象。这个属性被命名为构造函数,并引用与原型相关联的构造函数。(您可能记得第7章中的构造函数属性;这就是为什么每个对象都有一个构造函数属性)。添加到此原型对象的任何属性似乎都是构造函数初始化的对象的属性。
现在,如果这是真的,原型继承怎么会存在呢?我的意思是,假设构造函数函数的原型对象最初有一个构造函数属性。因为原型对象本身是一个对象,所以为了确定它的构造函数,我们通常使用prototype_object.constructor。但是现在prototype_object本身已经有了一个constructor属性,它指向--原型与之关联的构造函数--。在这种情况下,继承是如何存在的?
发布于 2016-06-01 21:32:03
老实说,.constructor属性并不重要,而且与继承JavaScript中的其他对象没有什么关系。它只是对象构造函数的一个方便的句柄。
例如,如果您有某个事物的实例,并且希望创建该事物的另一个实例,但是您没有它的构造函数的直接句柄,您可以这样做:
const myCar = new Racecar();
console.log(myCar.constructor); // [Function: Racecar]
const car2 = new myCar.constructor();
console.log(car2.constructor); // [Function: Racecar]重要的是要理解.constructor属性和对象的类不是同义词。正如您可能已经猜到的,.constructor属性是动态的,就像JavaScript中的大多数其他东西一样,因此不应该使用它来进行类型检查。
理解.constructor属性并不意味着某物是其他事物的子类,这一点也很重要。事实上,在JavaScript中没有可靠的方法来确定某个东西是否是其他东西的子类。因为它是一种动态语言,而且从其他对象继承属性的方法太多(包括实例化后从其他对象复制属性),所以类型安全子类在JavaScript中不存在,就像它们在其他语言中一样。
知道某物是否是兼容类型的最好方法是特性测试属性。换句话说,鸭子类型。
instanceof运算符忽略.constructor属性。相反,它检查构造函数的.prototype是否存在于对象的原型链中(通过身份检查)。
使用手动构造函数,继承可能会混淆.constructor属性连接(使其引用错误的构造函数)。您可以通过手动连接连接来修复它。例如,在ES5中这样做的规范方法是:
function Car () {}
console.log(Car.prototype.constructor); // Car
function Racecar () {}
Racecar.prototype = Object.create(Car.prototype);
// To preserve the same relationship we have with the Car
// constructor, we'll need to reassign the .prototype.constructor:
Racecar.prototype.constructor = Racecar;
var myCar = new Racecar();
console.log(myCar.constructor); // [Function: Racecar]ES6类自动为您执行此操作:
// ES6
class Car {}
class Racecar extends Car {}
const myCar = new Racecar();
console.log(myCar.constructor); // [Function: Racecar]尽管如此,我不太喜欢构造函数或ES6类,而且通常对.constructor属性几乎没有什么用处。为什么?因为工厂函数更灵活,功能更强大,而且它们不存在与构造函数和类继承相关的缺陷。见工厂函数与构造函数与类。
发布于 2010-02-02 12:58:05
不要担心构造函数属性--它是不相关的。跳过这些句子,你可能会更好地理解它。
如果你仍然不确定你的理解,谷歌的__proto__ -内部原型参考JS对象。它甚至暴露在Firefox和Safari上的脚本中。
一个很好的参考是属性
发布于 2010-02-02 09:02:51
如果您有一个对象obj,它的原型是obj.prototype,引用obj的构造函数的构造函数属性是obj.prototype.constructor。
对于对象obj.prototype,情况相同。假设是proto = obj.prototype,那么对proto构造函数的引用将在proto.prototype.constructor中找到。
这与obj.prototype.prototype.constructor相同,因此与obj.prototype.constructor没有冲突。
https://stackoverflow.com/questions/2182685
复制相似问题