2010-11-24 4 views
5

Можно создать дубликат:
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 для автомобиля. Ну, но в чем разница между ними. Что такое нюанс, добавляющий метод прототипа функции или его конструктор.

Спасибо ..

ответ

9

Функции, назначенные prototype будут всеми экземплярами; функции, назначенные в конструкторе, будут иметь отдельный функциональный объект для каждого экземпляра.

Кроме того, функции, назначенные в конструкторе, могут использовать переменные и параметры конструктора.

Например:

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
var foo = function(){ 
    this.bar = function(){alert('I am a method')} 
} 

Это дает каждому экземпляру Foo метод бара своему собственному. Так,

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')} 

Вы подключаете функцию в цепи прототипов функции Foo. Таким образом, каждый экземпляр получает тот же метод. Изменение baz изменит функцию на каждом экземпляре, поскольку каждый экземпляр наследует одну и ту же функцию.

Преимущество второго подхода очевидно с точки зрения наследования. Кроме того, в первом подходе, поскольку вы прикрепляете метод к каждому конкретному экземпляру, он не будет масштабироваться, если вы создаете несколько экземпляров foo, поскольку каждый экземпляр без необходимости должен иметь копию того же метода.

+0

** Неправильно **. Повторное назначение члена экземпляра скроет прототип для этого экземпляра. – SLaks 2010-11-24 19:02:40

Смежные вопросы