一 原理
利用工具函数,通过原型对象直接得到子类的实例。
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); // ["维生素", "膳食纤维", "柠檬酸"]