You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function_inherits(subClass,superClass){if(typeofsuperClass!=="function"&&superClass!==null){thrownewTypeError("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);}function_setPrototypeOf(o,p){_setPrototypeOf=Object.setPrototypeOf||function_setPrototypeOf(o,p){o.__proto__=p;returno;};return_setPrototypeOf(o,p);}
构造函数继承
// Sub 的原型是 Super_getPrototypeOf(Sub).call(this,val);
function_possibleConstructorReturn(self,call){if(call&&(_typeof(call)==="object"||typeofcall==="function")){returncall;}return_assertThisInitialized(self);}function_assertThisInitialized(self){if(self===void0){thrownewReferenceError("this hasn't been initialised - super() hasn't been called");}returnself;}functionSub(val){// super(val);var_this;_classCallCheck(this,Sub);return_possibleConstructorReturn(_this);}
拷贝继承
node util._extend 浅拷贝类似 Object.assign
function_extend(target,source){// Don't do anything if source isn't an objectif(source===null||typeofsource!=='object')returntarget;varkeys=Object.keys(source);vari=keys.length;while(i--){target[keys[i]]=source[keys[i]];}returntarget;}
实现继承的几种方式
原文链接
众所周知,JavaScript 并没有传统面向对象语言中类和类继承的概念。
JS一般使用
new
,instanceof
来确认对象之间的父子相似的关系。最新
es6
出现的类也不过是构造函数的语法糖。以下介绍下常见的继承方式及其优缺点。
原型继承
原型继承的思路就是,把父类的一个实例赋值给子类的
prototype
。这样便能继承父类的自有属性和方法和父类原型链上的属性和方法。
在构造函数绑定在
this
上的属性就是为了在new
一个实例的时候单独开辟新的内存空间,相互独立不影响。而所有实例引用共享
prototype
上的属性或方法,避免内存浪费。arr
会被所有 Sub 子类实例共享。而想要的结果是父类 Super 在
this
上声明的属性arr
也应该是子类 Sub 的自有属性 ;构造函数继承
使用
apply
或call
改变this
指向。父类 Super 在构造函数中
this
上声明的属性挂载到子类 Sub 实例this
上,以实现继承。组合继承
组合继承就是把上述原型继承和构造函数继承优点组合一下
this
声明的属性被还被挂载在 Sub.prototype 上,造成内存的浪费。寄生组合继承
这样就能解决组合继承的的缺点了。
为什么不直接把
Super.prototype
赋值给Sub.prototype
呢?而是以一个中间对象来承接
Super.prototype
链路呢?主要是为了避免修改
Sub.prototype
修改或覆盖了父类的原型链。类式继承
es6 中 class 语法实现与上述相同的效果
如果你用
babel
转码成一下的话,会发现继承的方式和寄生组合继承实现差不多。加了一些判断如是否
new
,在constructor
里是否调用super
等。例如:
转码后部分代码
super
是怎么实现的呢如果你把
super
代码注释掉转码后的代码不会有调用父类构造函数的代码
_this
为undefined
拷贝继承
node util._extend 浅拷贝类似
Object.assign
Vue Mixin 实现
用到了深、浅拷贝继承。
例如
data
、methods
、components
和directives
,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。同名生命周期钩子函数将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。
参考
The text was updated successfully, but these errors were encountered: