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
functionCat(name){Animal.call(this);this.name=name||'Tom';}(function(){// 创建一个没有实例方法的类varSuper=function(){};Super.prototype=Animal.prototype;//将实例作为子类的原型Cat.prototype=newSuper();})();// Test Codevarcat=newCat();
原型链与继承
众所周知JS的继承最主要是通过原型链来实现。最近踩了一个坑,所以再来回顾一下继承相关的概念。
Problem
其实这段代码和继承一点关系都没有,只是实例化而已。来看一下后面几行的输出是什么
继承与实例化
上面这段最普通的new代码叫 实例化,尽管这里面也涉及到原型链,但它不属于继承。
继承最基本的要求是要有一个父类、一个子类。
这可能不是一个难点,也不是一个复杂点,但恰好之前对这个概念有点模糊,认为实例化也属于继承的一种实现方式,概念上有点混淆。但现在应该清楚的能区分开,实例化和继承是没有关系滴。
继承的方式
原型链继承
将实例化的父类作为子类原型, 缺点非常明显啦,不太容易实现多继承,构造父类是不够灵活。
构造继承
构造继承解决了前面不能实现多类继承的缺点,但是有更大的一个缺点就是不能继承父类原型链。 其实只是用this来执行了一个特殊函数而已。
实例继承
利用new操作符可以返回对象的特点, 在内部实例化一个父类,然后将父类return, 缺点非常大就是子类不能像普通类一样书写 Cat.prototype.key = ....
拷贝继承
拷贝继承就是最原始的方法,想办法将父类的属性都拷贝到子类上。 但是不能拷贝父类原型链,因此也不太完美
组合继承
这种方法看起来不错,既能保证了父类的静态属性又能保证父类的原型链,只是需要实例化父类两次,有点浪费
寄生组合继承
这个特别像是平时用到的super(), 虽然也实例化了两个类,但是第二次是一个super类,基本空白,只用于原型链传递,不会将静态属性与方法赋值两次, 但是这种方法需要提炼一下,以供日常使用。 比较完美,但比较麻烦。
总结
其实日常工作可能对继承使用的并不是特别多,但作为基础概念还是要牢记的, 文章较多的参考了其余的blog,主要在于加深印象。
参考
http://www.cnblogs.com/humin/p/4556820.html
The text was updated successfully, but these errors were encountered: