php用构造方法创建函数,javascript - 自定义的构造函数可以创建函数吗◔ ‸◔?

黄舟2017-04-11 11:19:08

谢谢邀请!

首先来说,你是希望构造一个函数对象,而它同时又具有你自定义的类方法……这在 ES6 里其实是很容易通过继承实现的

class Foo extends Function { ... }

不过在 ES5 里也有不是很完美的实现方法,比如改变 f 的 __proto__ 为 Foo.prototype。不过这样改过之后你会发现 f 不再具有函数对象的一些方法,比如 call()、apply()、bind() 等。同时 __proto__ 不在标准中,所以不能保证每一个 JS 引擎都实现了。

回过头来说 ES6 的办法——因为 ES6 可以通过很多工具,比如 babel 翻译成 ES5 的,所以 ES6 实现了,ES5 也就能实现 (现在我对这句话表示怀疑——具体请看后面) 。

ES6 中,Foo 从 Function 继承,所以可以通过 Foo 构造一个函数对象,同时它可以用 Foo 中定义的方法。但问题在于构造这个对象的时候不能使用 function 定义语法,也不能使用函数表达式等,必须直接使用 Function 构造函数。构造函数需要函数体文本为作参数,比如

const f = new Function("console.log(\"Foo\");");

当然函数体很短的时候不是问题,比较长的时候才是麻烦的事情。当然可以用 es6 引入的 模板字符串 来解决,它允许多行字符。这会损失编辑器对其语法的检查。所以我的办法是定义一个临时函数,再通过 toString() 和正则表达式把函数体找出来。

最终完成的代码是这样的:

// es6 syntax

const body = function() {

console.log("Foo");

}.toString().replace(/^function\s*\(\)\s*\{|\}$/g, "");

class Foo extends Function {

constructor() {

super(body);

}

outStr() {

console.log("abc");

}

}

var f = new Foo();

f();

f.outStr();

不过很遗憾,使用 TypeScript 和 Babel 转出来的 es5 代码都不能运行……回复0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值