前言 大多OO语言都支持两种继承方式:接口继承 和 实现继承 ,而ECMAScript中无法实现接口继承,ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现。
1. 原型链 基本思想 :利用原型让一个引用类型继承另外一个引用类型的属性和方法。
构造函数,原型,实例之间的关系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
姓名
年级
总成绩
Androne
五年级
188
Bill
六年级
163
Gradle
五年级
159
Marian
五年级
192
Larray
四年级
195
原型链实现继承例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function SuperType ( ) { this .property = true ; } SuperType.prototype.getSuperValue = function ( ) { return this .property; } function subType ( ) { this .property = false ; } SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function ( ) { return this .property; } var instance = new SubType();console .log(instance.getSuperValue());
2. 借用构造函数 基本思想 :在子类型构造函数的内部调用超类构造函数,通过使用 call()
和 apply()
方法可以在新创建的对象上执行构造函数。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 function SuperType ( ) { this .colors = ["red" , "blue" , "green" ]; } function SubType ( ) { SuperType.call(this ); } var instance1 = new SubType();instance1.colors.push("black" ); console .log(instance1.colors);var instance2 = new SubType();console .log(instance2.colors);
3. 组合继承 基本思想 :将原型链和借用构造函数的技术组合在一块,从而发挥两者之长的一种继承模式。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function SuperType (name ) { this .name = name; this .colors = ["red" , "blue" , "green" ]; } SuperType.prototype.sayName = function ( ) { console .log(this .name); } function SubType (name, age ) { SuperType.call(this ,name); this .age = age; } SubType.prototype = new SuperType(); Subtype.prototype.constructor = Subtype; Subtype.prototype.sayAge = function ( ) { console .log(this .age); } var instance1 = new SubType("EvanChen" ,18 );instance1.colors.push("black" ); consol.log(instance1.colors); instance1.sayName(); instance1.sayAge(); var instance2 = new SubType("EvanChen666" ,20 );console .log(instance2.colors);instance2.sayName(); instance2.sayAge();
4. 原型式继承 基本思想 :借助原型可以基于已有的对象创建新对象,同时还不必须因此创建自定义的类型。
原型式继承的思想可用以下函数来说明:
1 2 3 4 5 function Object (o ) { function F ( ) {} F.prototype = o; return new F(); }
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var person = { name:"EvanChen" , friends:["Shelby" , "Court" , "Van" ]; }; var anotherPerson = Object (person);anotherPerson.name = "Greg" ; anotherPerson.friends.push("Rob" ); var yetAnotherPerson = Object (person);yetAnotherPerson.name = "Linda" ; yetAnotherPerson.friends.push("Barbie" ); console .log(person.friends);
ECMAScript5通过新增 Object.create()
方法规范化了原型式继承,这个方法接收两个参数:一个用作新对象原型的对象和一个作为新对象定义额外属性的对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var person = { name:"EvanChen" , friends:["Shelby" , "Court" , "Van" ]; }; var anotherPerson = Object .create(person);anotherPerson.name = "Greg" ; anotherPerson.friends.push("Rob" ); var yetAnotherPerson = Object .create(person);yetAnotherPerson.name = "Linda" ; yetAnotherPerson.friends.push("Barbie" ); console .log(person.friends);
5. 寄生式继承 基本思想 :创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真正是它做了所有工作一样返回对象。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function createAnother (original ) { var clone = object(original); clone.sayHi = function ( ) { alert("hi" ); }; return clone; } var person = { name:"EvanChen" , friends:["Shelby" , "Court" , "Van" ]; }; var anotherPerson = createAnother(person);anotherPerson.sayHi();
6. 寄生组合式继承 基本思想 :通过借用函数来继承属性,通过原型链的混成形式来继承方法 其基本模型如下所示:
1 2 3 4 5 function inheritProperty (subType, superType ) { var prototype = object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; }
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function SuperType (name ) { this .name = name; this .colors = ["red" , "blue" , "green" ]; } SuperType.prototype.sayName = function ( ) { alert(this .name); }; function SubType (name,age ) { SuperType.call(this ,name); this .age = age; } inheritProperty(SubType,SuperType); SubType.prototype.sayAge = function ( ) { alert(this .age); }
感谢阅读,希望对你有帮助!