2012-01-20 27 views
1

我在Javascript中使用私人會員http://javascript.crockford.com/private.html閱讀了crockford的頁面,並得到了一個可能與此有關的問題。爲什麼開發人員應該使用Prototype?在Javascript中使用Prototype的優點是什麼?

例如,

例如,我可以做這個

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

好吧,我想我現在明白了。在原型鏈中,如果我使用原型模式,則只有一個函數「bar」存在。另一方面,我創建了1000個這樣的功能。是對的嗎?如果是,建議使用原型模式,對嗎? 另外,在第一個中,x的類型是Foo,而在第二個中,x的類型是'Object'。謝謝 – thandasoru

+0

@thandasoru:沒錯。如果你正在創建一個對象的很多實例,你應該看看使用原型模式;否則它不會有明顯的區別。 – Matt

相關問題