為了簡化類的聲明,可以把派生子類的整個過程包裝在一個extend的函數,和其他語言中的extend關鍵字類似,基于一個給定的類結構創建一個新的類
function extend(subClass, superClass){ var F = function(){ }; F.PRototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.constructor = subClass; }這樣和原型鏈繼承中直接使用subClass.prototype = new superClass()有什么區別呢,作為一項改進,它添加了一個空函數F,并將它創建的對象添加進原型鏈中,這樣可以避免產生superClass的新實例,因為它可能比較龐大。下面是extend函數的使用場景:
function Person(name){ this.name = name; } Person.prototype.getName = function(){ return this.name; } function Author(name, books){ //執行Person構造函數,獲得Person對象中屬性 Person.call(this, name); this.books = books; } //獲得Person原型上的方法,實現原型繼承 extend(Author, Person); //在Author原型上繼續添加我們需要的方法 Author.prototype.getBooks = function(){ return this.books; }這樣唯一的缺點是在Author構造函數中還出現了Person,耦合程度太高,所以我們需要對extend函數做一些改進
function extend(subClass, superClass){ var F = function(){ }; F.prototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.constructor = subClass; subClass.superclass = superClass.prototype; //修正原型的constructor指向 if(!superClass.prototype.contrucotor == Object.prototype.constructor){ superClass.prototype.constructor = superClass; } } //使用中 function Author(name, books){ //從superClass.constructor中調用 Author.superClass.constructor.call(this, name) this.books = books; } //獲得Person原型上的方法,實現原型繼承 extend(Author, Person);與基于類的繼承不同,還有一種基于對象的原型式繼承,不需要構造函數
var obj = { name: 'sysuzhyupeng', say: function(){ alert(1); } } var newObj = clone(obj); newObj.name // 'sysuzhyupeng'來看一下clone函數的源碼:
function clone(object){ function F(){} F.prototype = object; return new F; }clone函數所返回的是一個以給定對象為原型對象的空對象
新聞熱點
疑難解答