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對象上就節省了很多記憶體。
總結:
- 將方法存放在執行個體上會導致每個執行個體都會擁有該方法的一份拷貝,導致記憶體的浪費。
- 優先將方法存放在prototype對象上。