翼度科技»论坛 编程开发 JavaScript 查看内容

深入理解 apply()方法

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
 
 

apply(thisArg)

apply(thisArg, argsArray)

thisArg

在 func 函数运行时使用的 this 值。请注意,this 可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。
argsArray 可选
一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。如果该参数的值为 null 或 undefined,则表示不需要传入任何参数。从 ECMAScript 5 开始可以使用类数组对象。浏览器兼容性请参阅本文底部内容。
返回值

调用有指定 this 值和参数的函数的结果。
 
 
1.数组合并用法
  1. const arr1 = ["anan", "zooey"];
  2. const arr2 = [198, 246, 357];
  3. //1.1 apply()
  4. arr1.push.apply(arr1, arr2);
  5. // console.log(arr1);//['anan','zooey',198,246,357]
  6. //1.2call()
  7. arr1.push.call(arr1, ...arr2);
  8. // console.log(arr1);//['anan','zooey',198,246,357]
  9. //1.3 es6
  10. const newArr = [...arr1, ...arr2];
  11. // console.log(newArr);//['anan','zooey',198,246,357]
复制代码
2.内置函数用法
  1. const num = [2, 5, 3, 6, 9, 0, 99];
  2. //2.1 错误用法
  3. let max1 = Math.max(num);
  4. // console.log(max1);//NaN
  5. //2.2 apply()
  6. let max2 = Math.max.apply(null, num);
  7. // console.log(max2);//99
  8. //2.3 es6
  9. let max3 = Math.max(...num);
  10. // console.log(max3);//99
  11. //2.4 call()
  12. let max4 = Math.max.call(null, ...num);
  13. // console.log(max4);//99
复制代码
3.apply链接构造器用法
你可以使用 apply 来链接一个对象构造器,类似于 Java。(Java的对象构造器用来创建对象,也可以对对象属性做一些特殊处理,如时间格式化)
在接下来的例子中我们会创建一个全局 Global_Objects/Function 对象的 construct 方法,来使你能够在构造器中使用一个类数组对象而非参数列表。
个人理解:给全局的Function 类定义一个construct方法,并且在construct方法中根据现有对象创建一个新的对象,利用apply链接构造器,返回一个新的对象,此时对全局的Function 对象拥有了一个的 construct 方法,能够返回类数组对象
  1. <strong>注意,这个construct方法是新定义的,不是原本的constructor</strong>
复制代码
  1. <em id="__mceDel"><strong><strong>定义中描述的类数组对象是下图的样子:</strong></strong></em>
复制代码
  1. //给全局的Function 类定义一个construct方法,并且在construct方法中创建一个新的对象,利用apply链接构造器,返回一个新的对象
复制代码
  1. Function.prototype.construct = function (aArgs) {<br>
复制代码
  //Object.create() 静态方法以一个现有对象作为原型,创建一个新对象
  1.   let oNew = Object.create(this.prototype);
  2.   this.apply(oNew, aArgs);
  3.   return oNew;
  4. };
  5. function MyConstructor() {<br>  //这里就是对数组进行遍历,然后封装成k:v的形式
  6.   for (let nProp = 0; nProp < arguments.length; nProp++) {
  7.     this["property" + nProp] = arguments[nProp];
  8.   }
  9. }
  10. //定义一个数组
  11. let myArray = ["zooey", "Hello world!", "anan"];
  12. let myInstance = MyConstructor.construct(myArray);
  13. //打印结果
  14. console.log(myInstance);
复制代码
 

来源:https://www.cnblogs.com/zry123/p/17435074.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具