上述代码是传统的通过function来定义类
ES5类继承 注意:静态方法无法继承
聊一聊 apply和call方法 改变对象中this的指向
apply和call均可以用来实现继承
什么情况下用apply,什么情况下用call?
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply里面传递了参数arguments,这个参数是数组类型,并且在调用Animal的时候参数的列表是对应一致的(也就是Animal的参数列表是这样的(name,age),而Cat的参数列表是(name,age,size)) 就可以采用 apply( Animal.apply(this,[name,age]) ) , 如果我的Animal的参数列表是这样的(age,name),而Cat的参数列表是(name,age,size),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置( Animal.call(this,age,name) ); 补充:call和apply与bind比较,前2者会执行函数,后者返回函数而不执行,this指向用法都一致 bind用法:b=a.bind(obj) a是function obj是a中this指向的对象 b是返回后接收到的function
1.apply和call的应用解决参数传递问题,同时也不会影响父类中属性的值,单纯只是利用了父类的构造函数
2.原型链的继承,用空函数来接收并传递父类原型中的方法,不会把父类不必要的属性值一起传递出去,同时又是重新创建了一个新对象,而不是通过简单赋值而与父类原型绑定在一起
(Cat.prototype = new Animal()与Cat.prototype =Animal.prototype 结合。前者会把age和voice一起传给Cat原型中的_prop_。后者则不能独立重写Cat原型中的speak方法,因与Animal原型绑定在一起,如果修改了Cat原型的speak方法Animal原型中的speak也会修改,这样就变成只能new Cat并在Cat实例中手动修改speak方法了)
上述代码是ES6的类定义方法,在ES6中有了class这个语法糖便可以更好的定义类并理解
ES6类继承 注意:同样无法继承静态方法