gpt4 book ai didi

javascript - Javascript构造函数属性有什么意义?

转载 作者:行者123 更新时间:2023-11-28 04:50:31 25 4
gpt4 key购买 nike

试图绕过 Javascript 对 OO 的看法...并且像许多其他人一样,对 constructor 感到困惑。属性(property)。特别是constructor的意义属性(property),因为我似乎无法使其产生任何影响。例如:

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 继承了 Age 属性。 。那么为什么很多人建议这是一个必要的步骤:

Bar.prototype.constructor = Bar;

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

最佳答案

第一步是了解构造函数原型(prototype)的含义。这并不难,但必须放弃古典意义上的“继承”。

构造函数

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

原型(prototype)

prototype 属性用于查找,以防相关对象不具有所需的属性。如果您编写 x.attr,JavaScript 将尝试在 x 的属性中查找 attr。如果找不到,它将在 x.__proto__ 中查找。如果它也不存在,只要定义了 __proto__,它就会在 x.__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# 的语言,其中类型查找(构造函数属性)将始终产生最具体的类型,而不是更通用的类型原型(prototype)链中更上层的对象。

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

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

关于javascript - Javascript构造函数属性有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964903/

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