首页 > 代码库 > 再次理解javascript的apply

再次理解javascript的apply

技术分享

普通函数执行的时候,this指向函数执行的上下文

 其实就是一个原型链的结构。。。
 
 我一直没有搞懂原型链
莫非它们像链条一样连在一起?
 
 昂。。。
 
原型链可以理解成继承吗?
 
就像,java里边的继承吧技术分享
嗯嗯
刚想说这个
 
 写js的时候一般没用到这里,还有apply()和call()一直搞不清
太灵活了,不知道是什么,想要干啥
 
 
技术分享
 ES6新的语法来讲,你可能会看着比较熟悉了
技术分享

call 和 apply就是绑定一个函数执行的 this指向

 

觉apply()和代码上下文有很大关系

这意思是修改父类吗?

 

 不是。。
 
 那我又不懂了
修改this指向是为了啥?
有何图谋?
 
 昂。。。
我想下场景哈
 
我明白了,是不是修改执行范围?
 

我个人认为。。。apply 和 call 之前的作用其实主要的作用就是为了实现原型链的继承

 

 比如appply(a)
apply前面的这个对象就会变成a的属性?
 
 
 不是变成a的属性。。。
而是本次执行的 函数执行的上下文变成了a
 

你的意思是只是在a中执行,但是和a没关系?

 也就是说 

XXX.apply(a)

XXX在执行的时候 你在里边调用 this 其实就是 a
 
技术分享
 
只是用下a的属性和其他数据字段?
 

是的呢。

 

我擦,js好底层啊

 

 跟python有点像
 

c#绝对做不到

 不过太狗屎了,别用this啊
用个其他变量也行啊
 
 
 // 我有一个类,会生成两个属性,一个name 一个age

function Person (name, age) {
  技术分享this.name = name
  this.age = age
}

Person.prototype.show = function () {
  console.log(‘name:‘, name, ‘age‘, age)
}

// 这时,我又需要一个新的类,在name 和 age之外,我还需要一个 sex属性,但是,Person类是可以复用的,没有必要重新写一遍那些代码,所以我们需要用到Person来执行一些属性的构建操作

function Man (name, age) {
  Person.apply(this, [name, age])  
}

var people = new Man(‘Niko‘, 18)
但是这个继承方式。。并没有办法拿到 你apply的那个函数的prototype
 
技术分享
粗暴的将prototype地址赋值过去。。
技术分享

就是这一句,会执行Person的代码,但是此时的this ,其实是Man实例化的上下文

 

 是早年继承的一种写法技术分享
技术分享
技术分享
技术分享这是近两年的新方法 
 

我明白了,这是为了实现继承

是为了让Person替Man初始化一些属性

 

但是也可以用在一些比较令人惊喜的地方,哈哈

 

差不多是那个意思

技术分享

这个是面试时候 apply出现频率比较高的

一个小技巧吧。
 
 
 person的属性man都有了吗?

真难理解

 

这个我又不理解了

 

 昂。。 apply第二个参数是一个数组,作为被apply的函数的参数依次塞进去。
因为Math.max只支持一个个的参数传递,没办法传入一个数组
所以。就是利用apply的这个特性。
 
 我不想说什么
我讨厌这种用法 
 
 
 JS好就好在了。。。各种你想象不到的代码技术分享
 
 这说明javascript的思想不统一
把语法和执行混在一起
 
 
 昂。。
你甚至可以在代码中生成代码然后去执行。。。
 
 原谅我智商不够
有勇无谋
 
 元编程吗?
 
 就是将一串字符串作为代码来执行而已……
 
 
以上内容整理自和一个前端大牛的聊天,感谢大牛!
差不多终于理解apply是为了实现继承,当执行时,呼叫父类帮忙初始化属性。
先理解到这里。
 
 
 
 
 
 
 

再次理解javascript的apply