续:JavaScript中的继承(中)
五、寄生式继承
寄生式继承和原型式继承紧密相连,基本思想和寄生构造函数类似,即创建一个仅用于封装继承过程的函数,在该函数内部以某种方式来增强对象。最后返回对象
示例代码如下:
示例代码如下:
function object(o) {
function F() {
}
F.prototype = o;
return new F();
}
function createAnother(original) {
var clone = object(original);
clone.sayHi = function () {
console.log('hi');
};
return clone;
}
var person = {
name: 'Bob',
friends: ['Alice', 'Greg']
};
var anotherPerson = createAnother(person);
console.log(anotherPerson.name);//Bob
console.log(anotherPerson.friends);//["Alice", "Greg"]
anotherPerson.sayHi();//hi
由以上代码可以看到:anotherPerson继承了person的属性和方法,同时增加了自己的sayHi方法
缺点:每个对象都有自己的副本,不能做到函数复用而降低效率
六、寄生组合式继承
寄生组合式继承是利用寄生式继承对组合继承进行优化而来。
关于组合式继承请参考JavaScript中的继承(中),这里我们分析一下传统组合式继承的缺点:无论什么时候,都会两次调用父类型的构造函数,一次是在创建子类型的原型的时候(创建一个父类型的实例作为子类型的原型);另一次是在子类型的构造函数内部调用父类型的构造函数(获得父类型属性的一个副本);举例如下:
关于组合式继承请参考JavaScript中的继承(中),这里我们分析一下传统组合式继承的缺点:无论什么时候,都会两次调用父类型的构造函数,一次是在创建子类型的原型的时候(创建一个父类型的实例作为子类型的原型);另一次是在子类型的构造函数内部调用父类型的构造函数(获得父类型属性的一个副本);举例如下:
function SuperType(name) {
this.name = name;
this.colors = ['red', 'blue'];
}
SuperType.prototype.sayName = function () {
console.log(this.name);
};
function SubType(name, age) {
SuperType.call(this, name);//第二次调用SuperType()
this.age = age;
}
SubType.prototype = new SuperType();//第一次调用SuperType()
SubType.prototype.constructor=SubType;
SubType.prototype.sayAge = function () {
console.log(this.age);
};
从以上代码可以看到,第一次调用SuperType函数时,子类型的原型会得到name和colors属性,第二次调用时,子类型对象上又会获得name和colors属性,同时屏蔽掉原型上这两个属性。那么原型上的name和colors属性完全没有必要存在,这就是寄生组合式继承优化的地方
寄生组合式继承的基本思想:通过借用构造函数来继承属性,通过原型链来继承方法,但是不必为了指定子类型的原型而调用父类的构造函数,我们需要的只是父类型原型的一个索引而已。举例如下:
寄生组合式继承的基本思想:通过借用构造函数来继承属性,通过原型链来继承方法,但是不必为了指定子类型的原型而调用父类的构造函数,我们需要的只是父类型原型的一个索引而已。举例如下:
function object(o) {
function F() {
}
F.prototype = o;
return new F();
}
//实现继承
function inherit(subType, superType) {
var temp = object(superType.prototype);
temp.constructor = subType;
subType.prototype = temp;
}
//测试用例
function SuperType(name) {
this.name = name;
this.colors = ['red', 'blue'];
}
SuperType.prototype.sayName = function () {
console.log(this.name);
};
function SubType(name, age) {
SuperType.call(this, name);
this.age = age;
}
inherit(SubType, SuperType);
SubType.prototype.ageAge = function () {
console.log(this.age);
}
更多请参考:
JavaScript中继承(上)
JavaScript中继承(中)
JavaScript中继承(上)
JavaScript中继承(中)