封装:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.htmljavascript
继承:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.htmlhtml
http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.htmljava
原型链继承:函数
优势:子类不单单能够访问父类原型上的属性和方法,一样也能够访问从父类构造函数中复制的属性和方法this
缺点:1.一个子类原型更改子类原型从父类继承来的引用类型属性就会直接影响其余子类;
2.因为子类实现的继承是靠其原型对父类的实例化实现的,所以在建立父类的时候,是没法向父类传递参数的,于是在实例化父类时也没法对父类构造函数的属性进行初始化。prototype
构造继承:htm
优势:避免了引用类型的属性被全部实例共享,并且能够在子类中向父类传参blog
缺点:这种类型的继承没有涉及原型prototype,因此父类的原型方法天然不会被子类继承,而要想被子类继承就必须把放在构造函数里,这样建立出来的每一个实例都会单独拥有一份而不能共用,这样就违背了代码复用的原则继承
基于此,为了综合这两种模式的优势,就有了组合继承。ip
function Parent (name) { this.name = name; this.colors = ['red', 'blue', 'green']; } Parent.prototype.getName = function () { return this.name; } function Child (name, age) { Parent.call(this, name); this.age = age; } Child.prototype = new Parent();
首先,在子类构造函数执行了父类构造函数,而后子类原型上实例化父类就是组合模式。如此,组合式继承就融合了原型链继承和构造函数继承的优势,而且过滤了其缺点。