我是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());
答案 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)
对象本身定义的属性优先于在其原型链中某处定义的属性。