通过"这个"分配功能有什么区别?与"原型"?

时间:2010-11-24 18:48:35

标签: javascript oop function prototype constructor

  

可能重复:
  Use of 'prototype' vs. 'this' in Javascript?

我对这两种向函数添加方法的方式感到困惑。让我用一个例子来解释。

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方法。好吧,但他们之间有什么区别。为函数的原型或它的构造函数添加方法的细微差别是什么。

谢谢..

2 个答案:

答案 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实例,则它将无法扩展,因为每个实例都会不必要地拥有相同方法的副本。