深入淺出物件導向和原型 番外篇 重新認識new

2021-09-14 01:58:02 字數 3250 閱讀 2867

我們在深入淺出物件導向和原型【概念篇2】在這篇文章中了解到了如何使用new function解決重複建立浪費記憶體的問題,其中的關鍵就是new,那麼這篇文章讓我們來重新了解new的前世今生

開學啦~~~高一年級主任龔主任需要為全年級每一位理科班新生錄入學號並為每一位學生生成相關檔案

不僅要自己留乙份而且要把每乙個檔案都上傳到學校資料庫

哇,全年級一千個學生,乙個個輸入,不要命啦?

還好龔主任學過程式設計

// 先造乙個物件,把相關資料都先寫進去,看看是啥樣的

var 學生 =

}// 不錯,檔案大致就是如此

// 再來個陣列自己留著作為備份

// 那麼迴圈一千次吧

var 全年級學生 =

for (var i = 0; i < 1000; i++)

}全年級學生.push(學生)

}

龔主任突然想到,他昨天晚上在才在segmentfault上看到有關於記憶體浪費的文章——深入淺出物件導向和原型【概念篇2】

那麼他寫的這個**就是典型的記憶體浪費啊

每個學生除了學號不同,其它都相同,咋辦呢?

哎對了,那篇文章說可以通過原型和原型鏈解決這個問題

那麼試試吧

// 先建立乙個學生原型,然後把相同的**都放在這裡

var 學生原型 =

}// 重新寫迴圈**

var 全年級學生 =

for (var i = 0; i < 1000; i++)

// 還記得嗎,每個物件自動帶有__proto__屬性

// 不過在這裡__proto__屬性的指向需要我們自己去設定

學生.__proto__ = 學生原型

全年級學生.push(學生)

}

好了,大功告成,這下記憶體不浪費了

但是,龔主任聽說程式猿寫**都追求可讀性強,他這寫的太不優雅了

再改改吧

// 優雅的**離不開封裝,現在讓我們來封裝封裝吧

function 學生(學號)

臨時物件.學號 = 學號

// 再把臨時物件的__proto__手工繫結到學生.原型

臨時物件.__proto__ = 學生.原型

return 臨時物件

}學生.原型 =

}// 好了,開始迴圈吧

var 學生們 =

for (var i = 0; i < 1000; i++)

好了,讓我們先遠離一下龔先生和他的**,來看看到底什麼是new
function 學生(學號) 

臨時物件.學號 = 學號

// 再把臨時物件的__proto__手工繫結到學生原型

// 【new做的第二件事:幫你自動把__proto__繫結到學生.原型】

臨時物件.__proto__ = 學生.原型

// 【new做的第三件事:幫你return臨時物件】

return 臨時物件

}// 【但new只有乙個要求:把學生原型改名為 學生.prototype】

學生.原型 =

}

那麼,我們用new該怎麼寫?so easy。new幫你做的事,你還自己做它幹嘛呢?
function 學生(學號) 

// 把臨時物件都改為this就好

this.學號 = 學號

// 再把臨時物件的__proto__手工繫結到學生原型

// 【new做的第二件事:幫你自動把__proto__繫結到學生原型】

// 我們不用手動繫結了,注釋掉

// 臨時物件.__proto__ = 學生原型

// 【new做的第三件事:幫你return臨時物件】

// 我們不用手動return了,注釋掉

// return 臨時物件

}// 【但new只有乙個要求:把學生原型改名為 學生.prototype】

// new 幫了我們這麼多忙,按照他的意思來唄,改了!

學生.prototype =

}var 學生們 =

for (var i = 0; i < 1000; i++)

new test(1)

console.log(test.prototype) //

使用new操作符的時候,為了記錄臨時物件是由哪個函式建立的,會在prototype裡新增乙個constructor屬性,指向建立臨時物件的函式

注意:如果直接給prototype賦值,則constructor屬性會消失

function 學生(學號) 

學生.prototype =

}var 學生們 =

for (var i = 0; i < 1000; i++)

// 沒有出現constructor屬性

console.log(學生.prototype) //

可以採用另一種賦值方式

function 學生(學號) 

學生.prototype.年級 = '高一'

學生.prototype.所選方向 = '理科班'

學生.prototype.上傳資料 = function ()

var 學生們 =

for (var i = 0; i < 1000; i++)

// 出現constructor屬性

console.log(學生.prototype) //

new的本質其實就是乙個語法糖,目的就是為了幫我們省**

創立乙個臨時物件,臨時物件指向類的this

把例項__proto__繫結到類的prototype

return臨時物件(也就是this)

var a = {} 是 var a = new object()的語法糖

var a = 是 var a = new array()的語法糖

var a = funciton(){} 是 var a = new function()的語法糖

new運算子

js 的 new 到底是幹什麼的?

javascript深入淺出 原型 原型鏈

原型 原型是js中實現繼承的過程中產生的乙個概念 繼承 指在乙個物件的基礎上建立新物件的過程,原型指在這過程中作為基礎的物件。建立物件var o var p object.create o p.a 1 p.b 2 console.log p.f 3 複製 通過object.create 方法我們傳入...

深入淺出Javascript 物件導向之閉包

閉包是指 有權訪問另乙個函式作用域中的變數的 函式。函式式閉包 在內部儲存資料和對外部無 在乙個函式內部建立另乙個函式 閉包 普通函式 在outer 執行完,區域性變數local被銷毀,記憶體僅僅儲存全域性作用域。function outer outer 30閉包 在outer 執行後,func 仍...

深入淺出物件池 Object Pool

在稍微大型一點的軟體系統開發中,通常我們會用到記憶體池,物件池,執行緒池,連線池等各種各樣的池 pool 本文就來講一講物件池 object pool 下面從四個方面來介紹一下物件池 1.什麼是物件池 object pool 池 poo 與集合在某種意義上有些相似。水池,是一定數量的水的集合 記憶體...