gpt4 book ai didi

javascript - Object.create 设置 __proto__ 但不是原型(prototype)

转载 作者:搜寻专家 更新时间:2023-11-01 04:10:00 25 4
gpt4 key购买 nike

我对使用 object.create 而不是经典的 js 方法来实现原型(prototype)继承还很陌生。

至少在 Chrome 中,我很惊讶地看到以下代码:

var baseObject = {
test : function(){
console.log('Child');
}
}

var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);

newObject.test();

产生这个(模拟网络工具中的输出):

Object {test: function, test: function} 
test: function (){
__proto__: Object
test: function (){
__proto__: Object
Parent
Child

所以你看到它没有设置原型(prototype),而只是“__proto__”,我认为不鼓励使用它。您可以在我的代码中看到,我能够正确地继承和调用父对象,但仅使用“__proto__”。使用“原型(prototype)”会导致错误(未定义)。

这是怎么回事?我认为 object.create 会设置“原型(prototype)”,因为这是标准(或者我假设的)。为什么它会填充并让我使用“__proto__”

最佳答案

不鼓励使用 __proto__ 来设置原型(prototype)继承,因为它是非标准的。这并不意味着您不能使用 Object.create() 来创建具有特定原型(prototype)对象的新对象。

默认情况下,对象没有 .prototype 属性。您混淆了函数的 .prototype 对象。

所以如果我有这样的函数:

function Foo() {

}

那个 Foo 函数对象有一个 .prototype 属性引用一个对象,该对象将用作调用时创建的任何对象的 __proto__作为构造函数。

var f = new Foo();

所以现在 f 是一个在其原型(prototype)链中带有 Foo.prototype 的对象。您可以使用 Object.getPrototypeOf();

验证这一点
Object.getPrototypeOf(f) === Foo.prototype; // true

Object.create 为您提供了建立相同原型(prototype)链的能力,但无需使用构造函数。所以这将是等效的。

var f2 = Object.create(Foo.prototype);

现在我们有一个对象,其设置方式与原始 f 对象相同。

Object.getPrototypeOf(f2) === Foo.prototype;            // true
Object.getPrototypeOf(f2) === Object.getPrototypeOf(f); // true

所以这只是以不同的方式做最终相同的事情。对象与其原型(prototype)链之间的关系是内部关系。非标准的 __proto__ 只是暴露了这种关系。

关于javascript - Object.create 设置 __proto__ 但不是原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15234127/

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