一、js继承分类
1、构造函数继承(call/apply)
2、prototype原型链继承
3、非构造函数继承
二、构造函数继承(call和apply的区别在于,传入参数的形式不同)
1、代码实例
//构造函数的继承 function Parent(name){ this.name = name; this.action = function(){ console.log(this.name) } } function Child(name){ Parent.call(this,name) } var obj = new Child("tom") obj.action()
2、优点
(1)避免引用类型数据共享
(2)创建子类的时候可以向父类传参
3、缺点
(1)方法都在构造函数中定义,每次创建实例都会创建一遍方法。
三、prototype原型链继承(1、子类的原型 = 父类的实例2、子类的原型 = 父类的原型)
1、代码示例
//原型链继承之子类原型 = 父类实例 function Parent(name){ this.name = name this.action = function(){ console.log(this.name) } } Parent.prototype.say =function(){ console.log("hello") } function Child(name){ } Child.prototype = new Parent("jiangqi") var obj = new Child() obj.action()
//原型链继承之子类原型 = 父类原型 function Parent(name,say){ this.name = name this.say = function(){ console.log("hello") } } Parent.prototype.see = function(){ console.log("see") } function Child(){ } Child.prototype = Parent.prototype Child.prototype.constructor = Child; var obj = new Child("jiangqi") obj.see()
第一种可以继承父类构造函数的各个属性和方法,但要new一个子类实例;第二种不用执行和建立父类的实例,节省空间;缺点是 Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对子类prototype的修改,都会反映到父类的prototype。
附上链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html