instanceof的原理
new運算子
類繼承和原型繼承的區別
原型鏈是物件導向的基礎,主要從以下幾方面入手:
字面量
var obj11 = ;以上兩種寫法得到的結果一樣,第一種是字面量方式,第二種是內建的建構函式。var obj12 = new object(name:「莉莉」);//內建物件的建構函式
通過建構函式
var person = function(name)object.createvar obj2 = new person(『莉莉』);
var person = ;在這種方式裡,obj3是例項,person是obj3的原型,name是person原型裡的屬性,object是建構函式。var obj3 = object.create(person);
建構函式通過new生成例項
建構函式也是函式,它的prototype指向原型。(所有函式都有prototype屬性,但例項沒有prototype屬性)
原型物件有constructor,指向該原型的建構函式。
舉個例子:
var foo = function(name)var foo = new foo(『莉莉』);
4. 例項的__proto__指向原型。(proto前後各有兩個橫線,捂臉)
所有引用型別(物件、陣列、函式)都有__proto__這個屬性。例如,foo這個函式的原型是function建構函式的例項。
基本原理
任何乙個例項都可以通過原型鏈找到它上面的原型,該原型物件的方法和屬性可以被它的所有原型例項共享。
object是原型鏈的頂端。
原型可以起到很好的繼承作用。原型物件中的方法和屬性可以被不同例項共享。
//給foo的原型新增say函式原型鏈的關鍵foo.prototype.say = function()
在訪問乙個例項時,如果例項本身沒找到該方法或屬性,就往原型上找。如果還找不到,就往上一級的原型找。
注意:例項是由建構函式new出來的,但是例項的__proto__指向的是建構函式的prototype。也就是說,例項的__proto__屬性與建構函式本身無關。
在原型鏈上,原型的上面還會有原型。以此類推往上繼續找__proto__屬性,如果這條鏈上能找到,那麼instanceof返回的結果也是true。
舉個例子:
foo instance of foo的結果為true,因為foo.proto=== foo.prototype為true。
foo instance of object的結果為true,因為foo.prototype.proto=== object.prototype為true。
但是我們不能說,foo是由object建立的例項,這句話是錯的。我們可以借助乙個問題來思考這句話的錯誤。
問題:已知a繼承b,b繼承c,那麼a是a直接生成的例項,還是由b或c生成的呢?
這需要用到原型的constructor屬性,foo.proto.constructor === foo =true,但是foo.proto.constructor === object =false。
所以用constructor判斷比instanceof要嚴謹。
當new foo()時發生了什麼:
建立乙個新的空物件例項。
將此物件的隱式原型指向其建構函式的顯式原型。
執行建構函式(傳入相應引數,沒有不用傳),同時this指向這個新例項。
如果返回值是乙個新物件,直接返回即可;沒有返回值或返回非物件值,那麼返回第一步建立的物件。
原型及原型鏈
原型定義 原型是function物件的乙個屬性,它定義了建構函式製造出的物件的公共祖先。通過建構函式產生的物件,可以繼承該原型的屬性和方法。原型是物件屬性prototype對應的值。注 原型是乙個物件。我們可以直接在建構函式的prototype上直接新增屬性,也可以將建構函式的prototype指向...
JS原型物件,原型鏈
js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...
物件 原型與原型鏈
object.definepropertylet obj object.defineproperty obj,key1 console.log object.getownpropertydescriptor obj,key0 console.log object.getownpropertydesc...