传统的类定义和ES6的类定义


image

上述代码是传统的通过function来定义类

ES5类继承 注意:静态方法无法继承

image

聊一聊 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方法了)


image

上述代码是ES6的类定义方法,在ES6中有了class这个语法糖便可以更好的定义类并理解

ES6类继承 注意:同样无法继承静态方法

image


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM