splat over JavaScript 对象(带有 new)
splat over JavaScript object (with new)?
如何在不使用 ECMA6 功能的情况下跨对象进行拼接?
尝试
function can(arg0, arg1) {
return arg0 + arg1;
}
function foo(bar, haz) {
this.bar = bar;
this.haz = haz;
}
myArgs = [1,2];
有了can
我可以做的:
can.apply(this, myArgs);
尝试使用foo
时:
new foo.apply(this, myArgs);
我收到此错误(因为我正在呼叫new
):
TypeError: function apply() { [native code] } is not a constructor
使用 Object.create
function foo(bar, haz) {
this.bar = bar;
this.haz = haz;
}
x = Object.create(foo.prototype);
myArgs = [5,6];
foo.apply(x, myArgs);
console.log(x.bar);
使用Object.create(proto)
是正确的方法。
Coco 和 LiveScript(Coffeescript 子集)提供了一种解决方法:
new foo ...args
编译为
(function(func, args, ctor) {
ctor.prototype = func.prototype;
var child = new ctor, result = func.apply(child, args), t;
return (t = typeof result) == "object" || t == "function" ? result || child : child;
})
(foo, args, function(){});
在 CoffeeScript 中:
(function(func, args, ctor) {
ctor.prototype = func.prototype;
var child = new ctor, result = func.apply(child, args);
return Object(result) === result ? result : child;
})(foo, args, function(){});
这些黑客丑陋、缓慢且不完美; 例如,Date
依赖于其内部[[PrimitiveValue]]
。看这里。
相关文章:
- 不显示带有本地json文件数据的谷歌地图脚本
- 如何创建带有插槽的vue js组件预加载程序
- 节点是否需要模块传递带有方括号的arg?这是个错误吗
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- Javascript”;类“;带有参数的扩展
- 带有加号的电话号码验证(可选)
- 创建带有和不带有JavaScript的Bootstrap下拉菜单
- 使用D3.js计算带有字母间距的文本长度
- 使用带有JavaScript的SOAP WebService
- 下拉框,带有展开的optgroup
- 带有填充属性的SVG矩形显示在包含元素的上方插入框阴影
- 带有验证和隐藏字段值的提交按钮
- 如何使用带有Preact的React路由器
- 带有let的JS/EECMAScript6私有字段的模式
- splat over JavaScript 对象(带有 new)
- 带有和不带 new 运算符的 JavaScript 构造函数
- 为什么调用带有new的函数时不返回相同的引用?
- 是否带有new的Javascript
- 将函数表达式传递到带有变量的new function()中
- 为什么没有看到带有'throw new Error'的堆栈跟踪?