面試 05 01 建立物件和原型鏈

2022-09-06 18:36:08 字數 2275 閱讀 8157

原型鏈是物件導向的基礎,是非常重要的部分。有以下幾種知識:

var obj11 = ;

var obj12 = new object(name: 'qianguyihao'); //內建物件(內建的建構函式)

上面的兩種寫法,效果是一樣的。因為,第一種寫法,obj11會指向object

var m = function (name) 

var obj3 = new m('smyhvae');

var p = ;

var obj3 = object.create(p); //此方法建立的物件,是用原型鏈連線的

第三種方法,很少有人能說出來。這種方式裡,obj3是例項,p是obj3的原型(name是p原型裡的屬性),建構函式是objecet

ps:任何乙個函式,如果在前面加了new,那就是建構函式。

上面的三行,**演示:

var foo = function (name) 

var foo = new foo('smyhvae');

上面的**中,foo.prototype.constructor === foo的結果是true

宣告:所有的引用型別(陣列、物件、函式)都有__proto__這個屬性。

foo.__proto__ === function.prototype的結果為true,說明foo這個普通的函式,是function建構函式的乙個例項。

原型鏈的基本原理:任何乙個例項,通過原型鏈,找到它上面的原型,該原型物件中的方法和屬性,可以被所有的原型例項共享。

object是原型鏈的頂端。

原型可以起到繼承的作用。原型裡的方法都可以被不同的例項共享:

//給foo的原型新增 say 函式

instanceof的作用:用於判斷例項屬於哪個建構函式。

instanceof的原理:判斷例項物件的__proto__屬性,和建構函式的prototype屬性,是否為同乙個引用(是否指向同乙個位址)。

注意1:雖然說,例項是由建構函式 new 出來的,但是例項的__proto__屬性引用的是建構函式的prototype。也就是說,例項的__proto__屬性與建構函式本身無關。

注意2:在原型鏈上,原型的上面可能還會有原型,以此類推往上走,繼續找__proto__屬性。這條鏈上如果能找到, instanceof 的返回結果也是 true。

比如說:

問題:已知a繼承了b,b繼承了c。怎麼判斷 a 是由a直接生成的例項,還是b直接生成的例項呢?還是c直接生成的例項呢?

分析:這就要用到原型的constructor屬性了。

所以,用 consturctor判斷就比用 instanceof判斷,更為嚴謹。

當new foo()時發生了什麼:

(1)建立乙個新的空物件例項。

(2)將此空物件的隱式原型指向其建構函式的顯示原型。

(3)執行建構函式(傳入相應的引數,如果沒有引數就不用傳),同時 this 指向這個新例項。

(4)如果返回值是乙個新物件,那麼直接返回該物件;如果無返回值或者返回乙個非物件值,那麼就將步驟(1)建立的物件返回。

參考《js高程》6.2.2

原型物件和原型鏈

基本型別 string number boolean null undefined object 引用型別 string number boolean object function array date regexp error 引用型別都是物件 建立物件的同時會自動建立乙個名稱叫做 proto ...

物件導向 建立物件 原型鏈 繼承

字面量建立物件 使用json形式建立物件,適用於建立單個物件.json js物件表示法,由鍵值對組成,每乙個鍵值對之間使用冒號連線,每一對鍵值對之間使用逗號隔開.var obj console.log obj console.log typeof obj object console.log obj...

弄懂js原型鏈 物件建立

第一種方式 字面量 var o1 var o2 newobject 第二種方式 建構函式 varm function name var o3 newm o3 第三種方式 object.create var p var o4 object.create p m.prototype.say functi...