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
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnauczNwcTO3ETY1QWN50SOygTYtEDNmNTL2kDO10SN0UzM0MzNx8CXzUjN08CX1kDMw8CX05WZth2YhRHdh9CXkF2bsBXdvwVbvNmLllXZ0lmLywGZvw1LcpDc0RHaiojIsJye.jpg)
關于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哦