让apply和new同时协作

(我存在的目的!)

对一个函数调用 我们有时会传入一个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

*寝る

时间: 2024-11-03 03:28:45

让apply和new同时协作的相关文章

angularJs项目实战!03:angularjs与其他类库的协作

引言:angularjs是一个中等重量级的前端开发框架 HTML是一门很好的为静态文本设计的语言,但要构建动态的web应用它就显的乏力了.通常,我们使用以下技术来解决静态网页技术在构建动态应用上的不足: 1.类库:类库是一类函数的集合,它能帮助你写web应用.这里起主导作用是你的代码,由你来决定何时使用类库.典型的类库,例如prototype.jquery等. 2.框架:框架式一种特殊的.已经实现的web应用,你只需要填充具体的业务逻辑.这里框架是起主导作用的,由它根据具体的逻辑来调用你的代码.

angularJs项目实战!03:angularjs与其他类库的协作(转)

angularjs,在我看来是个中等重量级的框架.即不像backbone那么简单,也不像dojo和Yui那么包罗万象.很多时候,妄图包罗万象,往往会出现很多子模块的质量高不成低不就,并且修改起来较为困难.过分精简,则框架内容单薄需要写的内容太多.angularjs这种相对中庸的风格,则非常符合我的需求. 目前,AngularJS三个我认为最为精妙的组件就是数据绑定(Scope),指令(Directive)和依赖注入(Dependency Injection),表现得非常好.相对而言,它的UI组件

Git团队协作工具

-- 故国神游,多情应笑我,早生华发. Git是什么? Git是一个版本控制工具,代码管理工具,团队协作工具.它跟SVN等传统工具实现同样的目的:但从某种程度来说,它更快,更灵活.我想绝大多数读者都已经在接触这个工具了,并且用于日常的项目中去了.我的这篇文章,不是作为一个Git入门教程,也不是作为一本大块头的教科书.(说到教科书,我推荐下面的这本.这本书确实好,很全面.我的这篇文章,其实就是这本书的读书笔记而已.) Pro Git -- http://git.oschina.net/progit

Git多人协作常用命令

Git多人协作工作模式: 首先,可以试图用git push origin branch-name推送自己的修改. 如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并. 如果合并有冲突,则需要解决冲突,并在本地提交.再用git push origin branch-name推送. Git基本常用命令如下: mkdir:         XX (创建一个空目录 XX指目录名) pwd:          显示当前目录的路径. git init          把当前的目

call和apply和bind的区别

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」. apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组function.apply(thisobj, args) 或者 function.apply(thisobj, args) 1.thisobj

Scala 中apply方法的用法

Scala 是构建在 JVM 上的静态类型的脚本语言,而脚本语言总是会有些约定来增强灵活性.关于协议在Python中是挺多的,看看Python的对象协议,有很多很多,如果对Python的对象协议了解(不了解的可以点击此处)的比较深刻的话,其实scala的apply方法也是很好理解的,比如说 Scala 为配合 DSL 在方法调用时有这么一条约定: 在明确了方法调用的接收者的情况下,若方法只有一个参数时,调用的时候就可以省略点及括号.如 "0 to 2",实际完整调用是 "0.

关于call 和 apply

权威指南上的说法是:可以将call 和apply看做是某个对象的方法,通过调用方法的形式 间接调用函数:需要重点说明是 :通过call和apply 调用的 函数:具体用法--->如下: 1.先说call的用法,call可以接收两个参数,也可能不是两个:第一个参数是要调用函数的 母对象,在函数体内通过this来获得对它的引用: function a(){ console.log(this); // 输出函数a中的this对象 } function b(){} // 定义函数b var obj =

How to Create an OCM Response file to Apply a Patch (文档 ID 966023.1)

How to Create an OCM Response file to Apply a Patch in Silent Mode - opatch silent (文档 ID 966023.1) APPLIES TO: Oracle Universal Installer - Version 10.2.0.1 to 11.2.0.4 [Release 10.2 to 11.2]Oracle Database - Enterprise Edition - Version 10.2.0.1 to

javascript继承机制 & call apply使用说明

一.继承机制 1.对象冒充:构造函数使用 this 关键字给所有属性和方法赋值,可使 ClassA 构造函数成为 ClassB 的方法,然后调用它. function ClassZ() { this.newMethod = ClassX; this.newMethod(); delete this.newMethod; this.newMethod = ClassY; this.newMethod(); delete this.newMethod; } 这里存在一个弊端,如果存在两个类 Clas