JavaScript 继承:理解构造函数属性
问题:
考虑代码:
function a() {} function b() {} function c() {} b.prototype = new a(); c.prototype = new b(); console.log((new a()).constructor); //a() console.log((new b()).constructor); //a() console.log((new c()).constructor); //a()
为什么不是构造函数尽管将 b 和 c 的原型设置为从 a 继承,但属性已更新?
答案:
为了理解这一点,让我们开始概念之旅:
现在,问题出现了:为什么构造函数属性没有定义在实例对象本身上?考虑以下示例:
function defclass(prototype) { var constructor = prototype.constructor; constructor.prototype = prototype; return constructor; } var Square = defclass({ constructor: function (side) { this.side = side; }, area: function () { return this.side * this.side; } }); var square = new Square(10); console.log(square.area()); // 100
在此示例中,构造函数属性是原型的方法,就像任何其他方法一样。然而,它专门用于初始化原型的实例。
在原型上定义构造函数属性有几个优点:
继承和构造函数属性
在继承的情况下,派生构造函数的原型属性设置为基构造函数的实例。因此,派生构造函数实例的内部 [[proto]] 属性也指向基本构造函数的原型。这会导致派生构造函数实例的构造函数属性指向基构造函数。
instanceof 运算符
instanceof 运算符对实例对象和构造函数进行操作。与流行的看法相反,它不依赖于实例的构造函数属性。相反,它遍历实例的原型链并检查其内部 [[proto]] 属性是否与构造函数的原型属性匹配。匹配返回 true,而原型链结束则返回 false。
以上是为什么 JavaScript 的 `constructor` 属性在原型继承期间不更新?的详细内容。更多信息请关注PHP中文网其他相关文章!