码迷,mamicode.com
首页 > 移动开发 > 详细

让apply和new同时协作

时间:2016-05-11 01:27:46      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

技术分享(我存在的目的!)

对一个函数调用 我们有时会传入一个array进行apply操作  但是apply并不能和new 同时进行!

如何在new的时候传入一个数组当作参数呢?

我还真遇到过这种情况! 几年前就!

记得当初还是埋头学习阶段の一段时光(那时毫无烦恼 成天进贴吧、Q群、 各种热心人 想想就怀念。。)

期间有写过一段代码 大致这样

var F = function(o1,o2){
  return new F2(o2,o2);
};
//... window[
‘$‘]=F; $(‘div‘).text(‘666‘);

那时候用过jquery 也感觉蛮方便的 也是出于好奇  于是就想着模仿下 就写了如上的代码(不用吐槽!)

过了段时间就觉得挺2的了 参考了jq 也做了改进  如下

var F = function(o1,o2){
  return new F.prototype.init.prototype(o1,o2);
};
F.prototype = F.p = {
  init:function(){ }
  //...
}
F.prototype.init.prototype = F.prototype;

嗯  这就跟jq类似了 jq也是这么处理的

技术分享

可是2个参数要重复写 !如果参数超过3个呢 那就感觉烦了

相信 那些了解的人可以想到解决方法了 我们这么处理  

const Miku = function(){
  const o = Object.create(Miku.prototype.init.prototype)
  return Miku.prototype.init.apply(o,arguments),o;
};
Miku.prototype = Miku.p={
  init(){
    //...
  }
}
Miku.prototype.init.prototype = Miku.prototype;

没有原生create的话 自己也可以实现一个基础的

下面是es6

class Miku {
  constructor(...miku) {
    console.log(new.target === Miku); // true
    console.log(miku.reduce((a,b)=>a+b));// 18
    
  }
}
const miku = Reflect.construct(Miku, [6,6,6]);

Reflect提供了方便的解决方案 他还有很多的方法 详情mdn

*寝る

 

让apply和new同时协作

标签:

原文地址:http://www.cnblogs.com/daidaidai/p/5479959.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!