gpt4 book ai didi

javascript - 为什么 obj.constructor.prototype 并不总是等于 obj.__proto__?

转载 作者:行者123 更新时间:2023-12-01 15:07:08 25 4
gpt4 key购买 nike

function Product(name, price) {
this.name = name;
this.price = price;
}

const p1 = new Product('Pen', 20);
const p2 = Object.create(p1);

console.log(p1.constructor.prototype === p1.__proto__); // true
console.log(p2.constructor.prototype === p2.__proto__); // false
我的理解是这两个总是相等的(如第一个 console.log 语句)。
但是,在进行一些调整时,我发现了这个令人惊讶的结果(第二个 console.log 语句)。
有人可以澄清我对 prototype之间关系的理解吗?和 __proto__ .提前致谢!

最佳答案

这仅适用于使用 new 创建的实例来自遵循标准原型(prototype)模式的构造函数。这些对象将继承自构造函数 .prototype对象,它有一个 .constructor指向构造函数的属性。这意味着当访问继承的 .constructor ,我们可以找到我们在其上继承的原型(prototype)对象。
但是,它不适用于拥有自己的 .constructor 的任意对象。属性(例如 {constructor: null} )或不直接从构造函数的原型(prototype)对象继承的对象,例如您的 p2 .
在不使用 new 的情况下澄清代码中发生的情况:

const Product = Object.create(Function.prototype);
Product.prototype = Object.create(Object.prototype);
Product.prototype.constructor = Product;

const p1 = Object.create(Product.prototype);
p1.name = "Pen";
p1.price = 20;
console.assert(Product.prototype == Object.getPrototypeOf(p1));
console.assert(!p1.hasOwnProperty("constructor") && p1.constructor == Product);
console.assert(p1.constructor.prototype == Product.prototype);
console.assert(p1.constructor.prototype == Object.getPrototypeOf(p1));

const p2 = Object.create(p1);
console.assert(p1 == Object.getPrototypeOf(p2));
console.assert(!p2.hasOwnProperty("constructor") && p2.constructor == p1.constructor);

关于javascript - 为什么 obj.constructor.prototype 并不总是等于 obj.__proto__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63206536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com