为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript构造函数属性的意义是什么?

Javascript构造函数属性的意义是什么?

慕尼黑8549860 2019-06-24 16:06:49
Javascript构造函数属性的意义是什么?试图在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;很明显,权利Bar构造器曾.构造时调用b,那么这个原型属性会产生什么样的影响呢?我很想知道让构造函数属性设置为“正确”实际上有什么区别-因为我看不出它对在创建对象之后实际调用哪个构造函数有任何影响。
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

这个constructor财产对任何内部事物都毫无实际意义。只有当您的代码显式地使用它时,它才是有用的。例如,您可能会决定需要每个对象都有一个对创建它的实际构造函数的引用;如果是这样,则需要将constructor属性在设置继承时显式地将对象分配给构造函数的prototype属性,如您的示例所示。


查看完整回答
反对 回复 2019-06-24
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

第一步是理解constructorprototype都是关于。这并不难,但我们必须放弃古典意义上的“继承”。

构造函数

这个constructor财产导致程序中的任何特殊效果,除非您可以查看它以查看与运算符一起使用的函数。new来创建你的对象。如果你打字new Bar()它将是Bar你打字new Foo它将是Foo.

原型

这个prototype属性用于在所述对象没有所请求的属性的情况下进行查找。如果你写x.attr,JavaScript将试图找到attrx的属性。如果它找不到它,它将查找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属性)总是会产生最特定的类型,而不是原型链中更高的泛型对象的类型。

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

试图将JavaScript强制进入一个经典的继承模型,而它所拥有的只是上面描述的原型机制,这就是造成混乱的原因。建议手动设置constructor-财产可能就是这样做的。抽象是可以的,但是构造函数属性的手动分配并不是JavaScript的惯用用法。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 388 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信