簡體   English   中英

javascript中原型的含義

[英]Meaning of prototype in javascript

我寫的遺傳短碼readerPerson

<script>

/* Class Person. */
function Person(name) {
    this.name = name;
}

Person.prototype.getName = function() {
    return this.name;
}

var reader = new Person('John Smith');
alert(reader.getName());

</script>

或者我可以刪除Person.prototype.getName = function() { return this.name; } Person.prototype.getName = function() { return this.name; }並在Person對象創建它。 例如

<script>
/* Class Person. */
function Person(name) {
    this.name = name;
    this.getName = function() { return this.name;}
}

var reader = new Person('John Smith');
alert(reader.getName());

</script>

在這兩種情況下調用getName()時我得到了相同的結果。 那他們有什么不同?

當您在原型上放置某些內容時,該對象的每個實例都共享該方法的相同代碼。 它們都使用相同的函數實例。

當您簡單地this設置方法時,每個對象實例都有自己的相同方法的副本

使用prototype效率更高。 請注意,這就是為什么通常在原型上放置方法的原因,因為您通常希望所有實例都使用相同的方法,但是屬性放在實例本身上,因為通常您不希望所有實例共享相同的屬性。

對於您的注釋,如果您在對象的構造函數上放置一個方法,那么您實際上已經創建了一個“靜態”方法。 沒有該對象的實例將具有該方法,它們都必須在構造函數上訪問它。 所以在你的情況下, Person.someMethod()

不同之處在於,當您將它放在原型上時, Person 所有實例共享getName的相同代碼 - 您可以通過分配其他內容來更改Person所有實例上的getName

Person.prototype.getName = function() { return 'Mr Jones' };

此外,由於它們共享相同的代碼,因此內存密集程度較低:您只有一個getName函數副本,而不是每個實例一個副本。

另一個區別是你可以稍后將Person設置為另一個類的原型,讓我們說Man ,它將繼承屬性/方法。

更新:這是一篇很好的文章解釋原型的其他屬性: https//stackoverflow.com/a/1534286/295262

不同之處在於,您進一步擴展Person類,子類不會繼承getName()方法

編輯:我在上面的陳述中不正確。 剛剛在jsfiddle上測試過。 無論我們是在原型上還是在函數實例本身上定義方法,它都可用於鏈中的子類。

這是證明: http//jsfiddle.net/u8qrd/

我知道將方法附加到原型有一個性能/內存的好處。 那個公寓在繼承方面沒有任何行為差異嗎?

(希望我在這里提問不違反SO規則)

當您將該方法放在構造函數中並從該構造函數創建一個對象時,每個對象都帶有它自己的getName函數。 對於10 Person實例,每個實例都帶有它自己的getName ,因此有10個單獨的getName函數。

如果將getName放在構造函數的原型中,則在所有實例中共享/繼承相同的getName函數。 所以對於10個Person實例,每個實例都有getName但只能引用1個getName函數。

使用原型可以節省內存,因為該方法是跨實例共享的,因此只使用了一個。

在基於類的單詞中,通過prototype聲明函數與this之間的區別將是這樣的:

原型:

實例的功能如下所示:

somefunc = function(){super()/*call the function of the super-class*/};

這個:

實例的功能如下所示:

somefunc = function(){/* Do same stuff as in the prototype func declared */};

現在更改原型上的函數對實例沒有影響。

當您將任何帶有this.functionname函數添加到任何對象構造函數時,該構造函數創建的每個對象都會創建該函數的副本,該副本也會占用內存。 想象一下,如果你有幾個由同一個構造函數創建的對象以及需要多少內存。 另一方面,當您使用cunstructorName.prototype.functionName函數創建它時,只在內存中加載一次,並且每個對象共享相同的原型函數構造函數。 這種方法使您的代碼在加載和操作中更快,並且還節省了大量內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM