寄生式继承
创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真地做了所有工作一样返回对象。
典型的寄生继承:
用父类构造函数的proptype创建一个空对象,并将这个对象指向子类构造函数的proptype。
在上述例子中,createAnother函数接收了一个参数,也就是将要作为新对象基础的对象。 anotherPerson是基于person创建的一个新对象,新对象不仅具有person的所有属性和方法,还有自己的sayHi()方法。
思路与寄生构造函数和工厂模式类似。 新的对象中不仅具有original的所有属性和方法,而且还有自己的sayHi()方法。 寄生式继承在主要考虑对象而不是自定义类型和构造函数的情况下非常有用。 由于寄生式继承为对象添加函数不能做到函数复用,因此效率降低。
解释2: 寄生继承的思路跟工厂模式差不多,就是调用一个仅用于封装继承过程的函数;
这个继承思路也是由克罗克福德推广的,没错!就是实现那个“原型式继承”的大神。 (原型式继承就是楼上贴出代码的“object”函数,在很多类库源码中都能发现它的身影) 简单而言,寄生继承就是不用实例化父类了,直接实例化一个临时副本实现了相同的原型链继承。(即子类的原型指向父类副本的实例从而实现原型共享) 所以“寄生组合继承”用了“寄生继承”修复了“组合继承”的小bug,让js完美实现继承了。
例子2:与寄生构造函数和工厂模式类似,创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后返回对象。
function createAnother(original) {
let clone = Object.create(original); //通过调用函数创建一个新对象
clone.sayHi = function () {
//以某种方式来增强这个对象
console.log("Hi");
};
return clone; //返回这个对象
}
let person = {
name: "Bob",
friends: ["Shelby", "Court", "Van"],
};
let anotherPerson = createAnother(person);
anotherPerson.sayHi();
//6.寄生继承 start
//6.寄生继承:创建一个封装基础过程的函数,该函数内部以某种方式来增强对象,最后再像真的是它做了所有工作一样返回对象。
/*
寄生式继承因为使用了一个函数以某种形式来增强对象,最后返回对象,那么复用率就不高,导致效率低。
*/
// 这个方法用于创建一个新对象并且连接原型链
/*
function object (obj) {
function F(){}
F.prototype = obj;
return new F ();
}
function createson (o,sex) {
// 传入父类创建个新对象
let newson = object(o)
// 这里增强对象,添加属性和方法
newson.sex = sex
newson.getsex = function () { console.log(this.sex) }
// 返回对象
return newson
}
console.log("6_1.寄生继承:")
let sub2 = createson(new Animal(),'famle')
console.log("6.寄生继承:",sub2)
sub2.getName()
sub2.getsex()
console.log("====================寄生继承end")
*/