2012-01-20 5 views
1

Я прочитал страницу crockford на частных членах http://javascript.crockford.com/private.html в Javascript и получил вопрос, который может быть несколько связан. Почему разработчик должен использовать Prototype?В чем преимущество использования прототипа в Javascript?

Например,

Например, я могу это сделать

var Foo = new Object(); 
Foo.bar = function() { alert('Its a bar'); }; 
var x = Foo; 
x.bar(); 

вместо

var Foo = function(){}; 
Foo.prototype.bar = function(){alert('Its a bar');}; 
var x = new Foo(); 
x.bar(); 

Оба этих реализаций сделать то же самое. Как отличается от другого? Это влияет на наследование каким-либо образом?

+1

вы можете прочитать шаблон дизайна здесь: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#prototypepatternjavascript –

+0

помадка! Большое вам спасибо за ссылку! – thandasoru

ответ

3

Когда вы используете шаблон прототипа, существует только один экземпляр атрибутов, которые вы добавляете к прототипу.

// Lets create 1000 functions which do the same thing 
for (var i=0;i<1000;i++) { 
    Foo = new Object(); 
    Foo.bar = function() { alert('Its a bar'); }; 

    var x = Foo; 
    x.bar(); 
} 

// This is the same as #1, but is more common 
function Foo() { 
    this.bar = function() { alert('It\'s a bar'); }; 
} 
for (var i=0;i<1000;i++) { 
    var x = new Foo; 
    x.bar(); 
} 

// Lets create 1 function 
var Foo = function(){}; 
Foo.prototype.bar = function(){alert('Its a bar');}; 
for (var i=0;i<1000;i++) { 
    var x = new Foo(); 
    x.bar(); 
} 

Паттерн прототип имеет недостаток не быть в состоянии получить доступ к закрытым членам.

// Lets create 1 function 
var Foo = function(){ 
    var private = 4; 

    this.baz = function() { 
     alert(private); 
    } 
}; 
Foo.prototype.bar = function(){alert(private);}; 

var x = new foo; 
x.bar(); // error; `private` is undefined 
x.baz(); // ok 
+0

Привет, я не могу понять приведенный выше фрагмент. Можете ли вы сказать мне, какой из вышеперечисленных рекомендуется использовать? – thandasoru

+0

Хорошо, я думаю, теперь понял. В цепочке прототипов будет существовать только одна функция «бар», если я использую шаблон прототипа. В другом я создаю 1000 таких функций. Это правильно? Если да, рекомендуется использовать образец прототипа, правильно ли? Кроме того, в первом случае x имеет тип Foo, тогда как во втором x имеет тип «Object». Спасибо – thandasoru

+0

@thandasoru: это правильно. Если вы создаете множество экземпляров объекта, вы должны посмотреть на использование прототипа patten; в противном случае это не будет иметь заметной разницы. – Matt

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