有必要拥有"原型"附加到类的每个方法..或命名空间在下面的示例中就足够了(完整示例请参阅下面的链接)。我知道这是一种很好的做法,但继承确实需要关键字" prototype"在每个方法中声明..什么是真正的必要性继承
if(animal === undefined) var animal = {};
animal.Mammal.prototype.haveABaby=function(){
var newBaby=new Mammal("Baby "+this.name);
this.offspring.push(newBaby);
return newBaby;
}
animal.Mammal.prototype.toString=function(){
return '[Mammal "'+this.name+'"]';
}
答案 0 :(得分:2)
原型与命名空间无关。
您在原型上定义一个函数,以便使用new Mammal()
创建的所有对象都具有此函数(方法):
Mammal.prototype.haveABaby=function(){
...
var phoque = new Mammal();
var d = phoque.haveABaby();
在这种情况下,所有实例都将共享相同的功能。如果您已经在实例上定义了该函数,那么您将使用更多内存(不一定非常重要),并且实例创建时间会更长。
如果需要,可以将其与名称空间结合使用:
animal = animal || {}; // note the simplification
animal.Mammal.prototype.haveABaby=function(){
...
var phoque = new animal.Mammal();
var d = phoque.haveABaby();
但这些是两个不同的主题。
Here's a good description of the link between prototype and inheritance.
答案 1 :(得分:1)
需要它。
如果您没有 prototype ,则该函数仅会添加到当前实例中。使用 prototype 意味着当您使用 new 关键字时,新对象也将获得该函数的副本。
即:
Mammal.toString = function() {...};
将 toString 函数放在 Mammal 上 - 但 NOT 会在每个实例上放置一个 toString 函数哺乳动物。例如使用上面的非原型声明:
var aDog = new Mammal();
aDog.toString() //result in undefined