Javascript 組合是一種大大提高代碼復用性的方式,它可以使JavaScript編程更加靈活,具有更強的擴展性和維護性。組合是把小的、單獨的功能組合成復雜的、更為強大的整體的一種方式。在JavaScript編程中,常用的組合方式包括:原型鏈組合、借用構造函數組合和寄生組合式繼承等。
原型鏈組合是指通過將一個對象的prototype屬性指向另一個對象或函數返回值的prototype屬性,實現兩個對象的屬性和方法的共享。下面是一個原型鏈組合的示例:
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayName = function() { console.log(this.name); } function Student(name, age, grade) { Person.call(this, name, age); this.grade = grade; } Student.prototype = Object.create(Person.prototype); Student.prototype.constructor = Student; Student.prototype.sayGrade = function() { console.log(this.grade); } var s = new Student("Tom", 18, "A"); s.sayName(); // Tom s.sayGrade(); // A
在上面的代碼中,Person構造函數定義了name和age兩個屬性和sayName方法,Student構造函數通過借用Person的構造函數實現了對name和age屬性的繼承,并通過Object.create()方法將Student的原型指向Person的原型,實現對sayName方法的繼承。最后,Student添加了一個sayGrade方法。
借用構造函數組合是指創建一個父類的實例,并將它賦值給子類,子類通過繼承父類來實現對父類構造函數的重用,下面是一個借用構造函數組合的示例:
function Person(name, age) { this.name = name; this.age = age; this.sayName = function() { console.log(this.name); } } function Student(name, age, grade) { Person.call(this, name, age); this.grade = grade; } var s = new Student("Tom", 18, "A"); s.sayName(); // Tom
在上面的代碼中,Person構造函數添加了一個sayName方法,Student構造函數通過借用Person的構造函數實現了對name和age屬性的繼承并覆蓋了sayName方法。最后,通過創建Student實例s來驗證這種方式的正確性。
寄生組合式繼承是將借用構造函數和原型鏈組合起來的一種方式,這種方式可以避免借用構造函數的缺陷,下面是一個寄生組合式繼承的示例:
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayName = function() { console.log(this.name); } function Student(name, age, grade) { Person.call(this, name, age); this.grade = grade; } function inheritPrototype(subType, superType) { var prototype = Object.create(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } inheritPrototype(Student, Person); Student.prototype.sayGrade = function() { console.log(this.grade); } var s = new Student("Tom", 18, "A"); s.sayName(); // Tom s.sayGrade(); // A
在上面的代碼中,Student構造函數通過借用Person的構造函數實現了對name和age屬性的繼承,然后通過inheritPrototype()函數將Student的原型指向Person的原型,并重新指定了constructor屬性。最后,Student添加了一個sayGrade方法。
總之,在JavaScript編程中,應該靈活使用組合,實現代碼的復用和擴展,提高代碼的可維護性。