每個物件上面都有乙個constructor屬性( 嚴格意義上來說,是原型上的,物件是通過查詢到原型找到 constructor屬性 ).後面講到原型的時候,我會用示意圖的方式說明。
1 functioncreateobj(uname)
6} 7 var obj1 = new createobj('ghostwu');
8 var obj2 = new createobj('衛莊');
9 console.log( obj1.constructor === createobj ); //
true
10 console.log( obj2.constructor === createobj ); //
true
預設情況下,物件的constructor等於例項化物件的建構函式, constructor最初的作用是用來標識物件的,但是並不是特別準確,因為constructor能被修改,
識別物件一般用instanceof關鍵字.
什麼是instanceof?
要理解這個關鍵字,需要搞清楚原型鏈,這裡,我提前把他放出來。
//假設instanceof運算子左邊是l,右邊是r
l instanceof
r //
instanceof運算時,通過判斷l的原型鏈上是否存在r.prototype
l.__proto__.__proto__ ..... ===r.prototype ?
//如果存在返回true 否則返回false
注意:instanceof運算時會遞迴查詢l的原型鏈,即l.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到頂層為止。
所以一句話理解instanceof的運算規則為:
instanceof檢測左側的__proto__原型鏈上,是否存在右側的prototype原型。
console.log( obj1 instanceof object ); //true
console.log( obj2 instanceof object ); //
true
console.log( obj1 instanceof createobj ); //
true
console.log( obj2 instanceof createobj ); //
true
obj1,obj2之所以是object的例項,因為所有物件繼承自object
借用建構函式
乙個空物件,可以借用現有的建構函式,完成屬性和方法的複製。
functioncreateobj(uname)
}var obj = new
object();
createobj.call( obj, 'ghostwu');
console.log( obj.username );
//ghostwu
console.log( obj.showusername() ); //
ghostwu
建構函式的優點與缺點
優點就是能夠通過instanceof識別物件,缺點是每次例項化乙個物件,都會把屬性和方法複製一遍
1 var obj1 = new createobj('ghostwu');2 var obj2 = new createobj('衛莊');
3 4 console.log( obj1.showusername === obj2.showusername ); //
false
從以上執行結果,可以看出obj1.showusername和obj.showusername不是同乙個【在js中,引用型別比較的是位址, 函式是一種引用型別】,而是存在兩個不同
的記憶體位址,因為每個物件的屬性是不一樣的,這個沒有什麼問題,但是方法執行的都是一樣的**,所以沒有必要複製,存在多份,浪費記憶體.這就是缺點
怎麼解決建構函式的方法複製多次的問題?
functioncreateobj(uname)
function
showusername ()
var obj1 = new createobj('ghostwu');
var obj2 = new createobj('衛莊');
console.log( obj1.showusername === obj2.showusername ); //
true
把物件的方法指向同乙個全域性函式showusername, 雖然解決了多次複製問題,但是全域性函式非常容易被覆蓋,也就是大家經常說的汙染全域性變數.
比較好的解決方案?
通過原型(prototype)物件,把方法寫在建構函式的原型物件上
functioncreateobj(uname)
createobj.prototype.showusername = function
()
var obj1 = new createobj('ghostwu');
var obj2 = new createobj('衛莊');
console.log( obj1.showusername === obj2.showusername ); //
true
原文出自js高手之路]建構函式的基本特性與優缺點
c 拷貝建構函式優缺點
前一段時間去面試,被人問了乙個這個問題,突然不知道怎麼回答了,後來查了查,才知道原來是怎麼樣了,現在總結一下吧。拷貝建構函式和賦值運算子用於建立物件的副本。在某些情況下由編譯器隱式呼叫拷貝建構函式,例如按值傳遞物件的時候。優點 拷貝建構函式可以很容易地複製物件。stl容器要求所有內容可拷貝和賦值。拷...
c 拷貝建構函式優缺點
c 拷貝建構函式優缺點 前一段時間去面試,被人問了乙個這個問題,突然不知道怎麼回答了,後來查了查,才知道原來是怎麼樣了,現在總結一下吧。拷貝建構函式和賦值運算子用於建立物件的副本。在某些情況下由編譯器隱式呼叫拷貝建構函式,例如按值傳遞物件的時候。優點 拷貝建構函式可以很容易地複製物件。stl容器要求...
靜態工廠 vs 建構函式,優缺點
靜態工廠是指用乙個靜態函式返回乙個例項,乙個典型的例子就是graphics類,例如 public static graphics fromhdc intptr hdc public static graphics fromhwnd intptr hwnd public static graphics...