Javascript中的OOP原型和继承

时间:2013-10-10 08:59:01

标签: javascript inheritance prototype

我是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());

2 个答案:

答案 0 :(得分: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中原型继承的更多信息:Why Prototypal Inheritance Matters

答案 1 :(得分:0)

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