我对这两种向函数添加方法的方式感到困惑。让我用一个例子来解释。
var foo = function(){ this.bar = function(){alert('I am a method')} } foo.prototype.baz = function(){alert('I am another method')} var car = new foo();
现在我们可以使用汽车的baz和bar方法。好吧,但他们之间有什么区别。为函数的原型或它的构造函数添加方法的细微差别是什么。
谢谢..
答案 0 :(得分:9)
分配给prototype
的函数将由所有实例共享;在构造函数中分配的函数每个实例都有一个单独的函数对象。
此外,构造函数中的函数assign可以使用构造函数的变量和参数。
例如:
var foo = function(param){
this.bar = function() { alert('I can see a parameter: ' + param); };
}
foo.prototype.baz = function() { alert('I can't see foo's parameters'); };
var car = new foo("Hi there!");
car.bar();
答案 1 :(得分:1)
var foo = function(){
this.bar = function(){alert('I am a method')}
}
这为每个foo实例提供了一个自己的bar方法。所以,
var car1 = new foo();
var car2 = new foo();
car2.bar = //new function definition here.
//car1.bar doesn't change.
在第二种情况下:
foo.prototype.baz = function(){alert('I am another method')}
您正在将函数附加到 function foo 的原型链。因此,每个实例都获得相同的方法。 更改 baz 会更改每个实例的功能,因为每个实例都会继承相同的功能。
第二种方法的优点在继承方面很明显。此外,在第一种方法中,由于您要将方法附加到每个特定实例,因此如果您要创建多个 foo实例,则它将无法扩展,因为每个实例都会不必要地拥有相同方法的副本。