本文實例講述了javascript面向對象三大特征之繼承。分享給大家供大家參考,具體如下:
繼承
在JavaScript中的繼承的實質就是子代可以擁有父代公開的一些屬性和方法,在js編程時,我們一般將相同的屬性放到父類中,然后在子類定義自己獨特的屬性,這樣的好處是減少代碼重復。繼承是面向對象的基礎,是代碼重用的一種重要機制。
——此文整理自 《jQuery 開發從入門到精通》 ,這是本好書,講的很詳細,建議購買閱讀。
繼承的作用
實現繼承的主要作用是:
① 子類實例可以共享超類屬性和方法。
② 子類可以覆蓋和擴展超類屬性和方法。
繼承的分類
在JavaScript中是不支持類的概念,使用構造器機制來實現類的特性。
JavaScript中類的繼承不止一種,主要包括:類繼承(構造函數繼承),原型繼承,實例繼承,復制繼承,克隆繼承,混合繼承,多重繼承等。
類繼承
類繼承也叫構造函數繼承,其表現形式是在子類中執行父類的構造函數。實現本質:比如把一個構造函數A的方法賦值為另一個構造函數B,然后調用該方法,使構造函數A在構造函數B內部執行,這是構造函數B就擁有了構造函數A中定義的屬性和方法。這就是B類繼承A類。示例如下:
function A(x){ this.x = x; this.say = function() { console.log(this.x + ' say'); }}function B(x,y) { this.m = A; // 把構造函數A作為一個普通函數引給臨時方法m() this.m(x); // 把當前參數作為值傳給構造函數A,并且執行 delete this.m; // 清除臨時方法 this.y = y; this.call = function(){ console.log(this.y); }}// 測試類繼承var a = new A(1);var b = new B(2,3);a.say(); // 1 sayb.say(); // 2 sayb.call(); // 3上面的實現方式很巧妙對吧,但是這種設計方式太隨意,缺乏嚴密性。嚴禁的設計模式應該考慮到各種可能存在的情況和類繼承關系中的互相耦合性。所以一般我們盡可能把子類自身的方法放在原型里去實現。下面這種創建方式會更好:
function A(x){ this.x = x; this.say = function() { console.log(this.x + ' say'); }}function B(x,y){ this.y = y; A.call(this,x); // 在構造函數B內調用超類A,實現綁定,用call來實現借用}B.prototype = new A(); // 設置原型鏈,建立繼承關系B.prototype.constructor = B; // 恢復B的原型對象的構造函數為B,如果不操作就會指向AB.prototype.gety = function(){ // 給類B添加新的方法 return this.y;}// 測試 類繼承var a = new A('A');var b = new B('Bx','By');a.say(); // A sayb.say(); // Bx sayconsole.log(b.gety()); // Byconsole.log(B.prototype.__proto__ === A.prototype); // true;console.log(b.constructor === B); // true 這里也可以把B中的 B.prototype.constructor = B; 去除,結果為false
新聞熱點
疑難解答
圖片精選