2013-04-04 49 views
1

正在學習原型。將函數「sayName」放入類中或稍後通過原型添加它會更好嗎?或者它是一樣的,取決於情況?原型 - 爲類添加功能

function Animal(name,numLegs){ 
    this.name = name; 
    this.numLegs = numLegs; 
    this.sayName = function(){ 
     console.log("Hi my name is " + this.name); 

    }; 
} 


var penguin = new Animal("Captain Cook", 2); 
penguin.sayName(); 

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

Animal.prototype.sayName = function(){ 
    console.log("Hi my name is " + this.name); 
}; 


var penguin = new Animal("Captain Cook", 2); 
penguin.sayName(); 
+0

可能重複(http://stackoverflow.com/questions/15497259/ JavaScript中的重寫方法) – 2013-04-04 08:26:39

回答

1

這是不一樣的,作爲第一個版本將使用更多的內存,爲有史以來Animal實例都有其自己的this.sayName。在後者中,所有Animal實例對訪問同一sayName

function Animal(name,numLegs){ 
    this.name = name; 
    this.numLegs = numLegs; 
    this.sayName = function(){ 
     console.log("Hi my name is " + this.name); 
    }; 
} 

var dog = new Animal(4, "Jack"); 
var alligator = new Animal(4, "Snap"); 

dog.sayName = function(){ console.log("woof"); } 

dog.sayName(); 
alligator.sayName(); 

會導致

woof 
Hi my name is Snap 

因爲dogalligator不共享相同的功能sayName,而改變後一個例子中的原型將改變sayName的所有調用。

1

這是更好地使用原型共享資源

+0

如果您在原型中使用普通對象,則會產生一個缺陷 - 它們可能會出乎意料地從一個實例變爲另一個實例。 – David 2013-04-04 08:33:58