【问题标题】:OOP Protoype and Inheritance in JavascriptJavascript中的OOP原型和继承
【发布时间】:2013-10-10 08:59:00
【问题描述】:

我是 Javascript 的新手,我刚刚完成了 codeAcademy 的长篇 Javascript 课程。我对prototype 有一些疑问。 我知道prototype 主要用于继承以及动态定义对象的方法。

但我还有一些问题。看我的代码。我使用原型在对象Animal 和另一个toString 中定义了一个toString。当我运行它时,为什么它显示:[Object] Dumbo 4 而不是[Proto] Dumbo 4

 function Animal(name, numLegs){
      this.name = name;
      this.numLegs = numLegs;

       this.toString = function(){
        return "[Object]" + this.name  + " " + this.numLegs + "\n";
        };
    }

    Animal.prototype.toString = function(){
     return "[Proto]" + this.name  + " " + this.numLegs + "\n";
    };

    var animal = new Animal("Dumbo", 4);
    console.log(animal.toString());

【问题讨论】:

  • 每次创建对象时都会在运行时覆盖toString。将console.logAnimal.prototype.toString 之前的一些消息和this.toString 之前的另一个消息放在一起
  • 正如 zerkms 所说,但并没有真正覆盖,更多阴影。属性解析从对象本身开始,然后查看[[Prototype]] 链上的属性。所以实例上的那个(在构造函数中分配,所以每个实例都有自己的副本)在继承的那个(每个实例共享)之前找到。
  • 答案已经给出,但您可能需要更多信息来了解发生了什么。用示例代码解释原型:stackoverflow.com/a/16063711/1641941 JavaScript 中的this 是什么:stackoverflow.com/a/19068438/1641941

标签: javascript inheritance prototype


【解决方案1】:

JavaScript 是一种原型的面向对象的编程语言,它仅仅意味着对象从其他对象继承。在 JavaScript 中,当在对象上找不到属性时,解释器会尝试在对象的原型链中找到它。如果在对象的原型链中也没有找到该对象,则解释器返回undefined

        null
          ^
          | [prototype]
          |
+------------------+
| Object.prototype |
+------------------+
          ^
          | [prototype]
          |
+------------------+
| Animal.prototype |
+------------------+
          ^
          | [prototype]
          |
   +------------+
   | new Animal |
   +------------+

如您所见,var animal = new Animal("Dumbo", 4) 继承自 Animal.prototype。因此,当您调用animal.toString() 时,它将执行Animal 构造函数中定义的函数。如果你 delete animal.toString 然后调用 animal.toString 那么它将改为调用 Animal.prototype.toString

阅读以下博客文章以了解有关 JavaScript 中原型继承的更多信息:Why Prototypal Inheritance Matters

【讨论】:

  • 有什么我不明白的。为什么 Animal 扩展 Animal.prototype?
  • @Dimitri Animal 不继承自 Animal.prototype。它是一个函数。因此它继承自Function.prototype。但是,当您在函数调用之前使用 new 时,函数调用被视为构造函数:new 创建一个新的对象对象,该对象继承自构造函数的 .prototype,并将新创建的对象绑定到内部的 this构造函数。因此new Animal 继承自Animal.prototype。我知道这有点令人困惑。也许以下答案会帮助您了解真正发生的事情stackoverflow.com/a/8096017/783743
【解决方案2】:

在对象本身上定义的属性优先于在其原型链中某处定义的属性是很自然的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-09
    • 2013-07-17
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多