Effective JavaScript Item 34 在prototype上儲存方法

來源:互聯網
上載者:User

Effective JavaScript Item 34 在prototype上儲存方法

本系列作為EffectiveJavaScript的讀書筆記。

不使用prototype進行JavaScript的編碼是完全可行的,例如:


function User(name, passwordHash) {this.name = name;this.passwordHash = passwordHash;this.toString = function() {return "[User " + this.name + "]";};this.checkPassword = function(password) {return hash(password) === this.passwordHash;};}var u1 = new User(/* ... */);var u2 = new User(/* ... */);var u3 = new User(/* ... */);

當建立了多個User類型的執行個體時,就存在問題了:不僅是name和passwordHash屬性在每個執行個體上都存在,toString和checkPassword方法在每個執行個體上都有一份拷貝。就像表示的那樣:




但是,當toString和checkPasswZ喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcmSxu7ao0uXU2nByb3RvdHlwZcnPyrGjrMnPzby+zbHks8nPwsPm1eK49tH519PBy6O6PC9wPgo8YnI+CjxwPjxpbWcgc3JjPQ=="http://www.2cto.com/uploadfile/Collfiles/20141009/20141009082135223.png" alt="\">


toString和checkPassword方法現在定義在了User.prototype對象上,也就意味著這兩個方法只存在一份拷貝,並被所有的User執行個體共用。

也許你會認為將方法作為拷貝放在每個執行個體上,會節省方法查詢的時間。(當方法定義在prototype上時,首先會在執行個體本身上尋找方法,如果沒有找到才會去prototype上繼續找)

但是在現代的JavaScript執行引擎中,對方法的查詢進行了大量最佳化,所以這個查詢時間幾乎是不需要考慮的,那麼將方法放在prototype對象上就節省了很多記憶體。

總結:

  1. 將方法存放在執行個體上會導致每個執行個體都會擁有該方法的一份拷貝,導致記憶體的浪費。
  2. 優先將方法存放在prototype對象上。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.