【发布时间】:2016-06-04 00:21:26
【问题描述】:
我正在寻找一种方法来构造一个具有某些继承性的函数。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype
我正在寻找的是一个对象,它是一个可以在程序中实例化的函数,但它的原型附加了 new 属性。
所以,我们不应该这样做:
Function.prototype.x = function(){
};
Function.prototype.y = function(){
};
所以我想做的是:
const proto = Object.create(Function.prototype);
proto.x = function(){};
proto.y = function(){};
但是,在程序稍后的某个时间点,我想实际为 proto 定义函数体,这样我就可以像函数一样调用 proto:
proto();
有没有办法做到这一点?以上肯定是行不通的:)
这更近了一点,错误信息在说明:
function F(){
}
F.prototype = Function.prototype;
var f = new F();
f.apply(null);
运行上面的代码,我们得到:
TypeError: Function.prototype.apply 在 [object Object] 上被调用, 这是一个对象而不是一个函数 在对象。 (/Users/amills/WebstormProjects/oresoftware/suman/exp7.js:15:3) 在 Module._compile (module.js:541:32) 在 Object.Module._extensions..js (module.js:550:10) 在 Module.load (module.js:458:32) 在 tryModuleLoad (module.js:417:12) 在 Function.Module._load (module.js:409:3) 在 Function.Module.runMain (module.js:575:10) 启动时 (node.js:160:18) 在 node.js:449:3
【问题讨论】:
-
我已经试过了,你在这条路上走得越远,它就越难搞。你想达到什么目的?为什么实例必须是函数?为什么不能简单地将函数附加到实例?
-
我相信你,即使考虑到我所做的少量实验 - 我正在创建一个库/API。继承只是意味着更高的性能,因为原型是共享对象-我想要的是一个对象,它是一个函数,但其原型是共享的,但不是函数原型:) 可能不会发生:(
-
在兼容的引擎中,您可以定义一个
class即extends Function(support)。 -
@AlexMills 一个函数被一个内部属性识别,
[[Call]]。这不是从原型继承的,Object.create()没有任何机制来定义它。 –class通过super()调用Function构造函数来工作,它确实设置了[[Call]]。 -
在创建 change the function's prototype 之后,可能的替代方案是
var foo = function () {}; Object.setPrototypeOf(foo, proto);。
标签: javascript node.js