JavaScript面向对象之继承
2017-03-06 16:28
211 查看
1. 原型链继承:
问题1.包含引用类型值的原型。
问题2.不能像超类型的构造方法传参。
2.借用构造函数(constructor stealing)(伪造对象或经典继承)
(1)无参:
问题:方法在构造函数中定义,无法复用。
3.组合继承(combination inheritance)(伪经典继承)
function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function (){ return this.property; } function SubType(){ this.subproperty = false; } SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function (){ return this.subproperty; } var instance = new SubType(); alert(instance.getSuperValue()); alert(instance instanceof Object); alert(instance instanceof SuperType); alert(instance instanceof SubType); alert(Object.prototype.isPrototypeOf(instance)); alert(SuperType.prototype.isPrototypeOf(instance)); alert(SubType.prototype.isPrototypeOf(instance));
问题1.包含引用类型值的原型。
问题2.不能像超类型的构造方法传参。
2.借用构造函数(constructor stealing)(伪造对象或经典继承)
(1)无参:
function SuperType(){ this.colors = ['red','blue','green']; } function SubType(){ SuperType.call(this); } var instance1 = new SubType(); instance1.colors.push("black"); alert(instance1.colors); var instance2 = new SubType(); var instance3 = new SuperType(); alert(instance3.colors);(2)传参:
function SuperType(name){ this.name = name; } function SubType(){ SuperType.call(this,"zhangsan"); this.age = 20; } var instance1 = new SubType(); alert(instance1.name); //zhangsan alert(instance1.age); //20 var instance2 = new SuperType(); alert(instance2.name); //undefined alert(instance2.age); //undefined
问题:方法在构造函数中定义,无法复用。
3.组合继承(combination inheritance)(伪经典继承)
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; } //继承方法 SubType.prototype = new SuperType(); SubType.prototype.sayAge = function(){ alert(this.age); } var instance1 = new SubType("zhangsan",20); instance1.colors.push("black"); alert(instance1.colors); // red,blue,green,black instance1.sayName(); //zhangsan instance1.sayAge(); // 20 var instance2 = new SubType("lisi",30); alert(instance2.colors); // red,blue,green instance2.sayName(); //lisi instance2.sayAge(); // 304. 原型式继承(Prototypal inheritance)
function object(o){ function F(){} F.prototype = o; return new F(); } var person = { name:"zhangsan", friends :["guojing","huangrong"] }; var anotherPerson = object(person); anotherPerson.name = "lisi"; anotherPerson.friends.push("zhoubotong"); var yetAnotherPerson = object(person); yetAnotherPerson.name = "wangwu"; yetAnotherPerson.friends.push("yidengdashi"); alert(person.friends); // guojing,huangrong,zhoubotong,yidengdashi5.寄生式继承(parasitic)
function object(o){ function F(){} F.prototype = o; return new F(); } function createAnother(original){ var clone = object(original); clone.sayHi = function(){ alert("hello"); }; return clone; } var person = { name:"zhangsan", friends :["guojing","huangrong"] }; var anotherPerson = createAnother(person); //anotherPerson.sayHi(); //hello anotherPerson.name = "lisi"; anotherPerson.friends.push("zhoubotong"); var yetAnotherPerson = object(person); yetAnotherPerson.name = "wangwu"; yetAnotherPerson.friends.push("yidengdashi"); alert(person.friends); // guojing,huangrong,zhoubotong,yidengdashi alert(anotherPerson.friends); // guojing,huangrong,zhoubotong,yidengdashi alert(yetAnotherPerson.friends); // guojing,huangrong,zhoubotong,yidengdashi6.寄生组合式继承
function object(o){ function F(){} F.prototype = o; return new F(); } function inheritPrototype(subType,superType){ var prototype = object(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } 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; } inheritPrototype(SubType,SuperType); SubType.prototype.sayAge = function(){ alert(this.age); } var instance = new SubType("zhangsan",30); alert(instance.name); //zhangsan instance.sayName(); //zhangsan instance.sayAge(); // 30
相关文章推荐
- JavaScript面向对象------继承
- 面向对象的JavaScript 四 ----- Javascript实现继承的方式(1)
- Javascript 面向对象 继承
- javascript面向对象学习笔记(一)——继承
- Javascript面向对象之四 继承
- Atlas学习手记(28):JavaScript面向对象的扩展(二):继承Inheritance
- javascript实现面向对象的继承
- Javascript 面向对象 继承
- (四)Javascript面向对象:继承
- 面向对象的Javascript - 通过原型(Prototype)实现继承
- 面向对象的JavaScript 五 ----- Javascript实现继承的方式(2)
- 面向对象的JavaScript(一) — 类及类的继承
- JavaScript的相关继承笔记以及使用外部库实现JavaScript的面向对象特性
- Javascript 面向对象 继承
- 面向对象的Javascript(5):继承
- javascript面向对象继承的三种方法
- JavaScript中的面向对象----继承
- JavaScript面向对象之——继承【原】
- javascript面向对象继承方式分享
- javascript面向对象----继承