JavaScript各种继承方式(四):原型式继承

一 原理

利用工具函数,通过原型对象直接得到子类的实例。

function inherit(obj){
    // 在闭包中创建子类,对外隐藏子类
    function Temp(){

    }
    Temp.prototype = obj;
    // 直接返回子类的实例
    return new Temp();
}

let fruit = {
    name:'水果',
    nutrition:['维生素']
};

let mango1 = inherit(fruit);
let mango2 = inherit(fruit);

mango1.nutrition.push('膳食纤维');
mango2.nutrition.push('柠檬酸');
console.log(mango1.nutrition); // ["维生素", "膳食纤维", "柠檬酸"]
console.log(mango2.nutrition); // ["维生素", "膳食纤维", "柠檬酸"]

二 优点

不涉及父类的构造函数,不调用父类的构造函数就能实现继承。

三 缺点

本质上还是原型链继承,只是通过工具函数进行了封装,仍然存在子类的实例共享原型对象的问题。

四 简化

ECMAScript 5提供了Object.create()方法,可以用做工具函数。

let fruit = {
    name:'水果',
    nutrition:['维生素']
};

let mango1 = Object.create(fruit);
let mango2 = Object.create(fruit);

mango1.nutrition.push('膳食纤维');
mango2.nutrition.push('柠檬酸');
console.log(mango1.nutrition); // ["维生素", "膳食纤维", "柠檬酸"]
console.log(mango2.nutrition); // ["维生素", "膳食纤维", "柠檬酸"]

猜你喜欢

转载自www.cnblogs.com/sea-breeze/p/10191328.html