代码之家  ›  专栏  ›  技术社区  ›  Marshel Aillón

对象之间的区别是什么。原型构造函数,对象。原型和对象。建造师?[重复]

  •  0
  • Marshel Aillón  · 技术社区  · 3 年前

    试图在Javascript对OO的理解上低头。。。而且,和其他许多人一样,对 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 ,那么这个原型属性有什么影响呢?我很想知道,正确设置构造函数属性实际上有什么实际意义,因为我看不出它对创建对象后实际调用哪个构造函数有任何影响。

    0 回复  |  直到 3 年前
        1
  •  5
  •   T.J. Crowder    4 年前

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

    构造器

    这个 建造师 所有物 没有 在您的程序中引起任何特殊的影响,除了您可以查看它以查看与运算符一起使用的函数 new 创建对象。如果你打字 new Bar() 会的 Bar 你打字了 new Foo 会的 Foo .

    原型

    这个 原型 属性用于在相关对象没有所需属性的情况下进行查找。如果你写信 x.attr ,JavaScript将尝试查找 attr 在…之间 x 的属性。如果它找不到它,它会往里面看 x.__proto__ .如果它也不在那里,它会往里面看 x.__proto__.__proto__ 等等,只要 __proto__ 定义了。

    那是什么呢 __原型__ 这跟我有什么关系 原型 ? 简而言之, 原型 是指“类型”而不是 __原型__ 代表“实例”。(我用引号表示,因为类型和实例之间实际上没有任何区别)。当你写作的时候 x = new MyType() 发生的事情(除其他外)是 x.__proto___ 即将 MyType.prototype .

    问题是

    现在,你只需要上面这些就可以得出你自己的例子的意思,但要尝试回答你的实际问题;“为什么要写这样的东西?”

    Bar.prototype.constructor = Bar;

    我个人从未见过它,我觉得它有点傻,但在你给出的上下文中,它将意味着 Bar.prototype -对象(通过使用 new Foo(42) )将假装是由 酒吧 而不是 我想这个想法是一些类似于C++/Java/C#的语言,其中类型查找 建造师 属性)将始终生成最特定的类型,而不是原型链中更高级的更通用对象的类型。

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

    试图强迫JavaScript进入一个经典的继承模型,而它只有上述的原型机制,这是造成混淆的原因。许多人建议手动设置 建造师 -物业公司可能正是这么做的。抽象是可以的,但这种手工分配构造函数属性的方式并不是JavaScript的惯用用法。