-
Notifications
You must be signed in to change notification settings - Fork 735
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Javascript中的apply和call继承 #56
Comments
handsome |
very good |
gooood |
学到了!! |
厉害了! |
apply和call的区别这个里面 |
console.log(new cat('wsscat','cute'))//type应该是wsscat才对,因为调用的时候 animal.apply(this,arguments),apply传递了this,arguments值为'wsscat','cute'这个2个值 |
最后一种的话,animal执行了2次,所以可能性能有缺陷; |
good |
让我想到这个题目jawil/blog#16 |
不错不错~ |
棒棒哒 |
good |
学到了~ |
you are a good boy! |
很强 |
|
call实现继承
call这里call的意思就是把animal的方法应用到cat这个对象身上,也就是animal的属性创建到了cat里面,所以cat就继承了animal的方法
call实现多重继承
当然我们可以继承多个构造函数,这就是多重继承
只要在cat的构造函数中有多个call就可以,此时的cat继承了wsscat和animal
apply和call的区别
其实apply和call这两个方法基本上是差不多的,区别在于call的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments(即传给构造函数的参数)
例如我们把上面的代码稍微改一下,如果此时我在new构造函数cat的时候传入参数
new cat('wsscat','cute')
我们的cat能接收arguments,但是如果此时继承是animal.call(this)
,没有给call传第二个参数的时候,生成的对象中type的值就会是undefined,所以为了让这个值能够让animal接收,我们可以在animal中传入第二个参数animal.call(this,type)这里用apply就很方便,因为arguments是数组,可以全部传给animal,而call就要一个个地传过去
继承的优化
如果构造函数this绑定太多属性(比如一些共同方法),在实例化后会造成浪费,为此我们一般会使用原型链来优化,但是使用原型链之后我们的apply和call的继承方法就会失效
为此我们一般使用混合的写法,使用原型链和(apply或者call)方法进行继承
具体两句话
让子的原型链指向父的实例(父实例化的对象)
cat.prototype = new animal();
让父的属性创建在子的this上
animal.call(this, type)
整体代码如下,那么就会让父原型链的属性和this上的属性都得到继承
The text was updated successfully, but these errors were encountered: