javascript(對象繼承)原型鏈

Js所有的函數都有一個prototype屬性,這個屬性引用瞭一個對象,即原型對象,也簡稱原型。這個函數包括構造函數和普通函數.JS中的繼承,子函數通過把父函數實例化實現的。
如以下代碼:

function SuperType111(){
    this.property=true;
}

SuperType111.prototype.getSuperValue = function(){
    return this.property;
};

function SubType222(){
    this.subproperty = false;
}

SubType222.prototype = new SuperType111();

SuperType111.prototype.getSubValue = function(){
    return this.subproperty;
};

var instance = new SubType222();

console.log(instance.getSuperValue());

instance 繼承 瞭SubType222 ,SubType222集成父函數SuperType111

繼承的原理:基於原型的搜索機制:當以讀取模式訪問一個實例屬性時,首先會在實例中搜索該屬性,如果沒有找到該屬性,則會繼續搜索實例的原型。

而在以上用例得實際上,不是SubType222的原型constructor屬性被重寫瞭,而是SubType的原型指向瞭一個另外一個對象的SuperType的原型。

原型鏈的最末端是Object對象的原型對象。

因此,在原型鏈的關系中,可以說instance是Object,SuperType111 ,SubType222 任何一個類型的實例,用instanceof能判斷。

值得註意的是:當子類型又需要重寫超類中的某個方法,或者需要添加超類型中不存在的方法,添加方法的代碼必須放在替換原型的語句之後。

原型鏈固然好用,可以用他來繼承,但是也存在問題,就是如果子函數對其原型鏈上的屬性進行修改的時候,會影響到超類型的屬性,因為他們指針所指的地方是同一個。

發佈留言