文章目录
- 对象的继承
- 1.定义
- 2.使用
- 方法一:使用函数来实现继承
- 方法二:使用call或者apply来实现继承
- call和apply的缺点
- 方法三:原型链继承方法
- 原型链继承的缺点
- 解决办法 组合继承
对象的继承
1.定义
JavaScript是没有明确的继承机制,也是通过模仿实现的。
首先父类和子类的构造函数是使用this关键字给所有属性和方法
赋值。为了实现继承,我们可以让父类的构造函数成为子类的方法
。然后调用该子类的方法通过this关键字给的属性和方法赋值。这样子类就拥有父类的方法与属性了。
2.使用
方法一:使用函数来实现继承
第一步:在子类里面和父类进行关联
this.子类属性=父类构造函数名;
第二步;调用子类.关联函数名(【参数】);//这一步就是把父类的函数和方法加入到子类里面
this.子类属性(【参数】);
第三步 删除关联delete this.子类属性//这个时候父类的方法和属性已经父之过来了
调用函数的时候无论是那种方式都要有小括号
方法二:使用call或者apply来实现继承
call方法:
语法: obj.call(thisObj, arg1, arg2, …
apply方法: .
语法: obj.apply(thisObj, [arg1, arg2, …);
解释:就是把object的参数复制到了thisobject里面,this代表所有的参数;
相同点:都是把obj(即this)绑定到 thisObj, 这时候thisObj具备
了obj的属性和方法。或者说thisObj继承 了obj的属性和方法。
区别: apply接收的是数组参数, call接收的是连续参数。
这个例子中改变sub对象的指向,sub指向了add,从而执行add
对象(函数)的操怍“8+5”。
。
注意: js 中的函数其实是对象,函数名是对Function对象的引
用。
再举一个例子
call和apply的缺点
这种办法只能继承父类的实例属性,因而找不到方法。
方法三:原型链继承方法
首先回顾下原型的概念 : Javascript规定,每一个构造函数都有一prototype
属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。那么我们可以将子类的prototype属性指向父类对象,继承父类的所有属性和方法从而实现继承。
JavaScript对象有一个特性,假设读取某个对象的属性x,首先会在这个对象的自身属性中查找。若没有找到,将会在此对象所处的原型链
中查找属性x,一直到找到属性x或者无原型为止。
凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。
举个例子
原型链继承的缺点
因为是公用的一个,函数或者是属性值,相当于java的final一个函数对象改变他,其他的对象在调用他的时候,用的是改变过后的
解决办法 组合继承
用借用构造函数模式来定义实例的属性,而原型模式用于定义方法和共享的属性