深入理解原型

2021-09-11 09:08:11 字數 2407 閱讀 6106

functiona()

var b = {};

console.log(a.constructor);

console.log(b.constructor);

var a = new a();

a.prototype = {};

var b = new a();

console.log(a.constructor);

console.log(b.constructor);

b.constructor = a.constructor;

console.log(a.constructor); //[function: a]

console.log(b.constructor); //[function: function]

console.log(b.constructor === a.constructor); //false

console.log(a instanceof a); //false

console.log(b instanceof a); //true

複製**

step1

functiona()

var b = {};

console.log(a.constructor);

console.log(b.constructor);複製**

解釋:引擎建立了object.prototype,然後建立了function.prototype

object是所有物件的爸爸,所有物件都可以通過__proto__.constructor找到它。

function是所有函式的爸爸,所有函式都可以通過__proto__.constructor找到它。

step2

var a = new a();   //這裡a的constructor指向a

console.log(a.prototype.constructor); //[function: a]

a.prototype = {}; //重寫原型

console.log(a.prototype.constructor); //[function: object]

var b = new a(); //這裡b的construcor指向object

console.log(a.constructor); //[function: function] a的constructor前後沒有發生變化

console.log(b.constructor); //[function: object]複製**

重寫原型之前a.prototype.constructor如圖所示:

var a = new a();後a.__proto__constructor指向a;

a.prototype = {};重寫原型後,a.prototype.constructor指向object。

var b = new a();時b的__proto__指向a的原型,但是a的原型裡面的constructor指向object。

所以b.constructor為[function: object]

step3

b.constructor = a.constructor;

console.log(b.constructor === a.constructor); //false

複製**

解釋

a.constructor在重寫a的原型之前,指向建構函式a;

把b.constructor = a.constructor;後,b.constructor指向function;

所以b.constructor === a.constructor為false;

step4

console.log(a instanceof a);  //false

console.log(b instanceof a); //true

複製**

剖析instanceof原理,其內部機制是通過判斷物件的原型鏈中是否能找到型別的prototype。

instanceof的**實現:

function instacne_of(l,r)

if(o === l)

l = l.__proto__;

}複製**

所以a.__proto__為function a;b.__proto__為object;a.prototype為object;

深入理解JavaScript的原型 原型鏈與繼承

在介紹原型是什麼之前,首先需要知道原型是做什麼用的,在js高設書中,明顯可以看到介紹有關原型的知識是在介紹建立物件的方式時提出來的,即使用原型模式來建立物件,顯而易見,原型這個概念是與建立物件聯絡在一起的。當然,建立物件的方式有很多種,如工廠模式,建構函式模式,以及與原型模式有關的其他模式等。我們建...

深入理解原型鏈的本質

原型鏈是作為實現繼承的主要方法,基本思想是利用原型讓乙個引用型別繼承另乙個引用型別的屬性和方法。實現原型鏈的 如下 function super super.prototype.getsupervalue function function sub 繼承了super sub.prototype ne...

深入理解JS instanceof和原型鏈

又介紹乙個老朋友 instanceof。對於值型別,你可以通過typeof判斷,string number boolean都很清楚,但是typeof在判斷到引用型別的時候,返回值只有object function,你不知道它到底是乙個object物件,還是陣列,還是new number等等。這個時候...