继承的实现方式之 寄生式

基本模式

原型式继承(Prototypal Inheritance)和工厂模式的结合,用一个函数先创建以父类为原型的对象,再为这个对象添加需要的子类属性及方法。最后直接返回这个对象。

function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

function createTalkingObj(original){
    let clone = object(original); //生成一个原型为original的clone
    clone.sayHi = function(){
        console.log("Hi");
    }
    return clone;
}

let person = {
    name: "Jack",
    age: 18,
    friends: ["Bob", "Lily"]
}

let personCanTalk = createTalkingObj(person);
personCanTalk.sayHi();
personCanTalk.friends.push("Mike");
console.log(person.friends);

需要注意的是,这种模式并没有用到构造函数,继承是直接发生在对象之间的,所有对象的constructor都是Object。

所有对象共享一套属性,如果改变子对象的非引用类型属性的值,如 personCanTalk.name = "TalkingJack"; ,实际是在子对象上新建了name属性,隐藏了父对象的属性。如果改变的是引用类型的值,则父对象,以及其他所有共享这一套属性的对象,都会被改变。

posted @ 2020-07-15 08:03  studystudyxinxin  阅读(107)  评论(0编辑  收藏  举报