2013-03-11 62 views
2

根據Douglas Crockford的說法,我可以使用類似於http://javascript.crockford.com/prototypal.html(稍微調整一下)的東西......但我對使用jQuery的方式感興趣。使用$ .extend是不錯的做法?如何使用jQuery實現多重繼承extend

我有4類:

  var A = function(){ } 
      A.prototype = { 
       name : "A", 
       cl : function(){ 
        alert(this.name); 
       } 
      } 
      var D = function(){} 
      D.prototype = { 
       say : function(){ 
        alert("D"); 
       } 
      } 

      var B = function(){} //inherits from A 
      B.prototype = $.extend(new A(), { 
       name : "B" 
      }); 

      var C = function(){} //inherits from B and D 
      C.prototype = $.extend(new B(), new D(), { 
       name : "C" 
      }); 


      var o = new C(); 

      alert((o instanceof B) && (o instanceof A) && (o instanceof C)); //is instance of A, B and C 
      alert(o instanceof D); //but is not instance of D 

所以,我可以調用每一個方法,屬性......從A,B,C和D的問題來了,當我想測試,如果o是實例d?我怎樣才能克服這個問題?

+0

只要注意一下,實際上,在鴨子型語言中,你很少關心對象是否是實例。你爲什麼要檢查instanceof D?請注意,通常你真正需要的是http://en.wikipedia.org/wiki/Mixin – 2013-03-11 15:11:48

+0

多重繼承不適用於'instanceof',因爲對象只能有一個線性原型鏈。 – Bergi 2013-03-11 16:11:36

回答

4

是否使用$ .extend

$.extend是單身有用的良好做法,但原型是不理想的。

使用Object.create(或克羅克福德的polyfill),你可以很容易地創建類似這樣的類。我使用$.extend來簡單處理屬性,並給它們默認值和模塊模式以保持良好的組織。希望這有助於:

// Helper that makes inheritance work using 'Object.create' 
Function.prototype.inherits = function(parent) { 
    this.prototype = Object.create(parent.prototype); 
}; 

var Person = (function PersonClass() { 

    var _defaults = { 
    name: 'unnamed', 
    age: 0 
    }; 

    function Person(props) { 
    $.extend(this, props, _defaults); 
    } 

    Person.prototype = { 
    say: function() { 
     return 'My name is '+ this.name; 
    } 
    }; 

    return Person; 

}()); 

var Student = (function StudentClass(_super) { 

    Student.inherits(_super); // inherit prototype 

    var _defaults = { 
    grade: 'untested' 
    }; 

    function Student(props) { 
    _super.apply(this, arguments); // call parent class 
    $.extend(this, props, _defaults); 
    } 

    Student.prototype.say = function() { 
    return 'My grade is '+ this.grade; 
    }; 

    return Student; 

}(Person)); 

var james = new Student({ name: 'James', grade: 5 }); 

console.log(james instanceof Student); // true 
console.log(james instanceof Person); // true 
+0

很好的例子。 TNX。它給了我新的觀點。我決定堅持使用這裏描述的方法:http://javascript.crockford.com/prototypal.html現在。但有沒有辦法一次使用多重繼承與乾淨的編碼? – AlFra 2013-03-11 18:30:53

1

的對象只有一個原型,所以你不能用一個電話讓其他兩種類型的實例。

$.extend(new B(), new D(), ...創建一個對象,該對象是B的一個實例。然後將D的所有屬性複製到新創建的對象中。但該對象仍然是B的實例。

使用$.extend本身既不好也不壞。但是你必須注意jQuery,這會讓你的代碼更少重用。而且您必須注意$.extend覆蓋具有相同名稱的屬性,而這可能是也可能不是您想要的屬性。

+0

tnx的答案!我認爲有一種方法可以同時使用多重繼承和乾淨編碼? – AlFra 2013-03-11 18:28:00

+0

那麼,多重繼承與乾淨編碼是相反的;)如果instanceof不是絕對必要的,那麼你的代碼就很好。沒有辦法,對不起。 – zeroflagL 2013-03-11 18:31:09

+0

也許這是更好的方式:P再次感謝你:) – AlFra 2013-03-11 18:40:16