第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在構(gòu)造函數(shù)中聲明javascript對象方法與在Prototype中聲明

在構(gòu)造函數(shù)中聲明javascript對象方法與在Prototype中聲明

翻翻過去那場雪 2019-07-22 10:41:09
在構(gòu)造函數(shù)中聲明javascript對象方法與在Prototype中聲明在創(chuàng)建javascript對象時,我可以將方法聲明放入構(gòu)造函數(shù)或原型中。例如,假設(shè)我想要一個具有name屬性和Bark方法的Dog類。我可以將Bark方法的聲明放入構(gòu)造函數(shù)中:var Dog = function(name) {     this.Name = name;     this.Bark = function() {         alert(this.Name + " bark");     };}或者我可以把它作為原型對象的一種方法:var Dog = function(name) {     this.Name = name;}Dog.prototype.Bark = function() {     alert(this.Name + " bark");};當我實例化Dog類型的對象時,這兩種方法似乎都很好:var dog = new Dog("Fido");dog.Bark();  //Both approaches show "Fido bark"我應該更喜歡這些方法中的一種而不是另一種嗎?使用一種比另一種更有好處嗎?在幕后,這兩種方法最終會做完全相同的事情嗎?大多數(shù)人傾向于采用哪種方法?謝謝你的幫助。
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經(jīng)驗 獲得超1個贊

兩者是不同的:第一個將存儲對該方法的引用。在原型對象上,而第二個解決方案則將方法存儲在物體的。這意味著每個對象將包含一個額外的指針,因此每個對象占用更多的內(nèi)存。

每個對象方法允許該方法引用構(gòu)造函數(shù)中的變量(閉包),因此它允許您訪問一些無法從原型方法訪問的數(shù)據(jù)。

最后,一個原型方法可以后來變了,那就是你可以重新定義Bark在運行時,對Prototype對象進行此更改,此更改將適用于該原型的所有對象(因為方法總是通過原型查找)。


查看完整回答
反對 回復 2019-07-22
?
絕地無雙

TA貢獻1946條經(jīng)驗 獲得超4個贊

我看到的絕大多數(shù)javascript代碼都使用原型方法。我認為有三個原因,我可以想到我的頭頂。

第一,避免讓每個類都成為一個巨大的構(gòu)造函數(shù):構(gòu)造函數(shù)邏輯在構(gòu)造函數(shù)中,其他方法的邏輯在其他地方聲明-這主要是一個清晰的東西/關(guān)注點的分離,但是在javascript中,你需要盡可能的清晰。

二是效率。在構(gòu)造函數(shù)中聲明方法時,您將為對象的每個實例創(chuàng)建一個函數(shù)對象的新實例,并將構(gòu)造函數(shù)的作用域綁定到這些函數(shù)中的每一個(也就是說,它們可以將參數(shù)引用到構(gòu)造函數(shù),只要該對象存在,構(gòu)造函數(shù)就永遠不可能被GC_d_當您在原型上聲明方法時,所有實例都使用函數(shù)對象的一個副本-Prototype屬性不會復制到實例中。

第三個原因是,當您使用Prototype方法時,可以各種方式“擴展”一個類,例如Backbone.js和CoffeeScript的類構(gòu)造所使用的原型鏈接。


查看完整回答
反對 回復 2019-07-22
  • 3 回答
  • 0 關(guān)注
  • 294 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號