function createAnother(original){ var clone = cloneObject(original); // 继承一个对象 返回新函数 // do something 以某种方式来增强对象 clone.some = function(){}; // 方法 clone.obkoro1 = '封装继承过程'; // 属性 return clone; // 返回这个对象 }
7.2 优点
1、兼容性好,最简单的对象继承。
7.3 缺点
1、多少实例共享被继承的属性,存在被篡改的情况,不能传递参数。
八、寄生组合式继承(call+寄生式封装)
1、使用借用构造函数来继承父类this声明的属性和方法。2、使用寄生式继承来设置父类prototype为子类prototype的原型来继承父类的属性和方法。
8.1 实现
function Father(...arr) { this.some = '父类属性'; this.params = arr; } Father.prototype.someFn = function() { console.log(1); } Father.prototype.someValue = '2'; function Son() { Father.call(this, 'xxxx'); this.text = '2222'; } function inhertPro(son, father){ // 原型式继承 var fatherPrototype = Object.create(father.prototype); // 设置Son.prototype的原型是Father.prototype son.prototype = fatherPrototype; // 修正constructor 指向 // constructor的作用:返回创建实例对象的Object构造函数的引用。 // 在这里保持constructor指向的一致性 son.prototype.constructor = son; } inhertPro(Son, Father); var sonInstance = new Son();
8.2 优点
1、寄生组合式继承是当前最成熟的继承方法,也是先也常用的继承方法,在大多数Js框架中都是用这个作为继承方案。
寄生组合式继承相对组合继承的优点:
1、只调用了父类构造函数一次,节约了性能。
2、避免生成了不必要的属性。
3、使用原型式继承保证了原型链上下文不变,子类的prototype只有子类通过prototype声明的属性和方法,父类的prototype只有父类通过prototype声明的属性和方法。
九、ES6-extends继承
9.1 实现
ES6可以用过extends关键字实现继承,这比通过ES5的修改原型链实现继承,要清晰和方法很多。
class Point{} class ColorPoint extends Point{}
9.2 注意
子类必须在constructor方法中代用super方法,否则新建实例将会报错,这是因为子类自己的this对象,必须先通过父类的构造函数完成塑性,得到父类的属性和方法,然后对其加工,加上子类自己的属性和方法。如果不调用super方法,子类将得不到this对象。如果没有定义constructor方法,这个方法会被默认的添加。
9.3 转换
ES6继承的原理跟寄生组合式继承是一样的。优缺点也相仿。
把ES6的代码装换为ES5 https://www.babeljs.cn/repl
转换前:
class Point{} class ColorPoint extends Point{}
转换后:
转换的结果核心代码如下:用于子类的prototype继承父类的prototype方法。
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
9.4 区别
ES5的继承实质是先创建子类的实例对象this,然后将父类的方法添加到this上。
ES6的继承实质是先将父类实例对象的方法和属性加到this上面,然后在用子类的构造函数修改this。
参考
JS基础-深入浅出继承
JavaScript高级程序设计