2009-12-09 70 views
7

的Javascript功能都可以在一個對象的原型是這樣聲明:原型函數在JavaScript中如何與正常函數不同?

<object name>.prototype.<variable name>=function(){ 
// 
// 
} 

如何它這方面比下面的聲明有什麼不同?

<object name>.<variable name>=function(){ 
// 
// 
} 

原型函數在JavaScript中如何與正常函數不同?

+1

請重新短語,一個真正的問題可以回答。 – gahooa 2009-12-09 03:10:23

+3

@gahooa:你爲什麼認爲這個問題不能回答。這可能是非常高的水平,但它仍然是一個問題。您可以隨時對其進行編輯以使其更清晰。無需下來投這個語法錯誤,只是因爲...... – Josh 2009-12-09 03:13:18

+0

http://stackoverflow.com/questions/186244/what-does-it-mean-that-javascript-is-a-prototype-based-language – 2009-12-09 03:13:39

回答

7

在基礎對象的原型上聲明的函數被該對象類型的所有實例繼承。

例如..

String.prototype.foo = function() { 
    return 'bar'; 
}; 

現在,每個字符串將有函數foo()可用。

'test'.foo(); // returns 'bar'

瞭解更多關於基於原型繼承here

+2

+1此外,值得明確指出的功能*和*性能上的對象的原型,宣佈由該對象的所有實例,*即使是那些已經被實例化。* – 2009-12-09 03:33:45

+0

是的,好點的繼承。最後一部分非常重要。在成員被認爲是'未定義'之前,原型有點作爲最後一個捕獲,因此修改原型也會影響現有對象。 – Matt 2009-12-09 03:36:48

16

原型函數實例函數,而正常的功能是「靜態」的功能。在類的原型上聲明的函數將在該類的所有實例上提供。

var MyClass = function(){ 
}; 
MyClass.staticFunction = function(){alert("static");}; 
MyClass.prototype.protoFunction = function(){alert("instance");}; 

MyClass.staticFunction(); //OK 
MyClass.protoFunction(); //not OK 

var myInstance = new MyClass(); 
myInstance.staticFunction(); //not OK 
myInstance.protoFunction(); //OK 
+2

+1這是我見過的最簡潔的解釋。 – 2010-06-13 18:22:33

0

馬特和伊戈爾已經提供了足夠的代碼示例,但你可以閱讀的最好的文章(短,正確的,給點)之一是Prototypal Inheritance,由Douglas Crockford的。

也有許多不同的方式,以方便通過流行的庫繼承(DojoPrototype等)