首页 > web前端 > js教程 > 为什么 JavaScript 的 `constructor` 属性在原型继承期间不更新?

为什么 JavaScript 的 `constructor` 属性在原型继承期间不更新?

Barbara Streisand
发布: 2024-12-01 05:05:17
原创
618 人浏览过

Why Doesn't JavaScript's `constructor` Property Update During Prototypal Inheritance?

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 Foo() {} 这样的函数时,JavaScript 会在内部创建一个 Function 实例(构造函数
  • 每个构造函数都有一个prototype属性,它是一个指向其原型对象的指针。
  • 原型对象有一个指向其构造函数的构造函数属性。
  • 当用 new Foo() 创建 Foo 的新实例时,会创建一个新对象,其内部的 [[proto]] 属性指向该对象的原型constructor.

现在,问题出现了:为什么构造函数属性没有定义在实例对象本身上?考虑以下示例:

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
登录后复制

在此示例中,构造函数属性是原型的方法,就像任何其他方法一样。然而,它专门用于初始化原型的实例。

在原型上定义构造函数属性有几个优点:

  • 逻辑正确性:例如,Object.prototype.constructor指向对象。如果在实例上定义,则对于 Object.prototype 来说是未定义的,因为它是 null 的实例。
  • 与其他原型方法的一致性:这简化了 new 的实现,不需要定义每个实例的构造函数属性。
  • 效率:所有实例共享相同的构造函数属性,减少内存

继承和构造函数属性

在继承的情况下,派生构造函数的原型属性设置为基构造函数的实例。因此,派生构造函数实例的内部 [[proto]] 属性也指向基本构造函数的原型。这会导致派生构造函数实例的构造函数属性指向基构造函数。

instanceof 运算符

instanceof 运算符对实例对象和构造函数进行操作。与流行的看法相反,它不依赖于实例的构造函数属性。相反,它遍历实例的原型链并检查其内部 [[proto]] 属性是否与构造函数的原型属性匹配。匹配返回 true,而原型链结束则返回 false。

以上是为什么 JavaScript 的 `constructor` 属性在原型继承期间不更新?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板