使用建構函式帶來的最大的好處就是建立物件更方便了,但是其本身也存在乙個浪費記憶體的問題:
function
person
(name, age)
}var p1 =
newperson
('lpz',18
)var p2 =
newperson
('jack',16
)
在該示例中,從表面上好像沒什麼問題,但是實際上這樣做,有乙個很大的弊端。
那就是對於每乙個例項物件,type
和sayhello
都是一模一樣的內容,
每一次生成乙個例項,都必須為重複的內容,多占用一些記憶體,如果例項物件很多,會造成極大的記憶體浪費。
console.
log(p1.sayhello === p2.sayhello)
// => false
對於這種問題我們可以把需要共享的函式定義到建構函式外部:
function
sayhello
=function()
function
person
(name, age)
var p1 =
newperson
('lpz',18
)var p2 =
newperson
('jack',16
)console.
log(p1.sayhello === p2.sayhello)
// => true
這樣確實可以了,但是如果有多個需要共享的函式的話就會造成全域性命名空間衝突的問題。
你肯定想到了可以把多個函式放到乙個物件中用來避免全域性命名空間衝突的問題:
var fns =
, sayage:
function()
}function
person
(name, age)
var p1 =
newperson
('lpz',18
)var p2 =
newperson
('jack',16
)console.
log(p1.sayhello === p2.sayhello)
// => true
console.
log(p1.sayage === p2.sayage)
// => true
至此,我們利用自己的方式基本上解決了建構函式的記憶體浪費問題。
但是**看起來還是那麼的格格不入,那有沒有更好的方式呢?
小結
C 建構函式問題
初始化列表 與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。class foo 初始化列表 private string name int id 從概念上來講,建構函式的執行可以分成兩個階段,初始化階段 和計算階段...
c 中構造函式呼叫另一建構函式的問題
題目如下 問下列 的列印結果為0嗎?include include using namespace std struct cls cls int main 我當時是這樣想的,建構函式就是為物件分配記憶體的過程,其主要目的就是為了對私有變數進行初始化,所以我就想乙個物件不能呼叫 兩次建構函式,即使這兩...
C 建構函式的繼承問題
一 基類沒有定義建構函式的情況 1 派生類也可以不定義建構函式,全部採用預設的建構函式,此時,派生類新增成員的初始化工作可以用其他公有函式來完成。2 如果只有派生類定義建構函式,只需要構造派生類物件即可,物件的基類部分使用預設建構函式來自動建立 二 基類中存在建構函式 1 基類中存在不帶引數的建構函...