gpt4 book ai didi

javascript - Javascript constructor 属性的意义是什么?

转载 作者:IT王子 更新时间:2023-10-29 02:39:29 26 4
gpt4 key购买 nike

试图绕过 Javascript 对 OO 的看法......并且像许多其他人一样,对 constructor 属性感到困惑。特别是 constructor 属性的重要性,因为我似乎无法让它发挥任何作用。例如:

function Foo(age) {
this.age = age;
}

function Bar() {
Foo.call(this, 42);
this.name = "baz";
}

Bar.prototype = Object.create(Foo.prototype);
var b = new Bar;

alert(b.constructor); // "Foo". That's OK because we inherit `Foo`'s prototype.
alert(b.name); // "baz". Shows that Bar() was called as constructor.
alert(b.age); // "42", inherited from `Foo`.

在上面的例子中,对象 b 似乎有一个名为 (Bar) 的正确构造函数——它继承了 Foo 。那么为什么很多人建议这是必要的步骤:

Bar.prototype.constructor = Bar;

很明显,构造b时调用了正确的Bar构造函数,那么这个原型(prototype)属性有什么影响呢?我很想知道将构造函数属性设置为“正确”实际上有什么实际区别——因为我看不到它对创建对象后实际调用哪个构造函数有任何影响。

最佳答案

第一步是了解constructorprototype 是什么。这并不难,但必须放下经典意义上的“继承”。

构造函数

constructor 属性不会在您的程序中产生任何特殊影响,除了您可以查看它以了解哪个函数与运算符new 创建您的对象。如果您键入 new Bar(),它将是 Bar 而您键入 new Foo,它将是 Foo

原型(prototype)

prototype 属性用于查找,以防相关对象没有所需的属性。如果您编写 x.attr,JavaScript 将尝试在 x 的属性中查找 attr。如果找不到,它将在 x.__proto__ 中查找。如果它也不存在,它将在 x.__proto__.__proto__ 中查找,只要 __proto__ 已定义,它就会继续查找。

那么什么是 __proto__,它与 prototype 有什么关系?简而言之,prototype 用于“类型”,而 __proto__ 用于“实例”。 (我用引号说是因为类型和实例之间没有任何区别)。当您编写 x = new MyType() 时,发生的(除其他外)是 x.__proto___ 被设置为 MyType.prototype

问题

现在,以上内容应该是您推导自己示例的含义所需要的全部内容,但要尝试回答您的实际问题; “为什么要写这样的东西”:

Bar.prototype.constructor = Bar;

我个人从未见过它,我觉得它有点傻,但在你给出的上下文中,它意味着 Bar.prototype 对象(使用 new 创建Foo(42)) 将被视为由 Bar 而不是 Foo 创建。我想这个想法是一些类似于 C++/Java/C# 类语言的东西,其中类型查找(constructor 属性)将始终产生最具体的类型而不是更通用的类型原型(prototype)链中更上层的对象。

我的建议:不要过多考虑 JavaScript 中的“继承”。接口(interface)和混合的概念更有意义。并且不要检查对象的类型。相反,检查所需的属性(“如果它像鸭子一样走路并且像鸭子一样嘎嘎叫,它就是鸭子”)。

试图强制 JavaScript 进入经典继承模型,当它只有如上所述的原型(prototype)机制时,才是造成困惑的原因。许多建议手动设置 constructor-property 的人可能只是试图这样做。抽象很好,但是这种手动分配构造函数属性并不是 JavaScript 的惯用用法。

关于javascript - Javascript constructor 属性的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4012998/

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