4

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

但我还有一些问题。看我的代码。我使用原型toString在对象Animal和另一个中定义了一个。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());
4

2 回答 2

5

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 中原型继承的更多信息:为什么原型继承很重要

于 2013-10-10T09:31:46.047 回答
0

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

于 2013-10-10T09:17:55.483 回答