天天看點

javascript原型繼承的了解

java的繼承:

class Parent {

}
class Child extends Parent {

}           

 js的繼承:

function Parent() {}
function Child() {}
Child.prototype=Parent;//Child的原型是Parent,即Child繼承于Parent      

 如果按java的程式設計思想,是不是感覺應該這樣寫?實際上是錯誤的。應該是:Child.prototype=new Parent();   WHY?

var parent = new Parent();
Child.prototype = parent;

var c1 = new Child();
c1.__proto__  === parent;//true      

new Child()幹了什麼,為啥會有一個__proto__屬性?

建立一個對象,增加一個屬性__proto__,c1.__proto__ = Child.prototype。這裡要說明一下__proto__這個屬性在不同的浏覽器中不一定相同。這樣通過Child這個函數執行個體化的每個對象都有一個相同的__proto__屬性即parent,形成一個鍊條,原型鍊繼承也就實作了。

js的繼承機制完全和java的不一樣,千萬不要用java的繼承來了解js的繼承。可以用key-value來了解,js裡的對象都是key-value,__proto__是自動加入的一個key而已,其value即為構造函數的prototype

javascript原型繼承的了解

關于instanceof的了解

function Func() {}
var f = new Func();
f instanceof Func;//true      

    f instanceof Func可以寫成:

var L = f, R = Func;
while(true) {
    if(L === null) {
        return false;
    }
    if(L.__proto__  ===  R.prototype) {
        return true;
    }
    L = L.__proto__;
}      

這樣就好了解了吧,其實就是周遊對象的原型鍊,看有沒有原型對象等于該函數的原型對象。不是看constructor哦

繼續閱讀