【问题标题】:Object.create(Function.prototype) => create Function which inherits properties [duplicate]Object.create(Function.prototype) => 创建继承属性的函数 [重复]
【发布时间】: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。继承只是意味着更高的性能,因为原型是共享对象-我想要的是一个对象,它是一个函数,但其​​原型是共享的,但不是函数原型:) 可能不会发生:(
  • 在兼容的引擎中,您可以定义一个classextends 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


【解决方案1】:

正确的做法如下!

第一步

创建一个继承自 Function.prototypeObject

const obj = Object.create(Function.prototype);  // inherits many properties, etc

第 2 步

稍后在你的程序中声明函数

const f = function(){};

第 3 步

f__proto__ 设置为obj

Object.setPrototypeOf(f,obj); 基本等价于f.__proto__ = obj;

....这似乎没有任何问题,感谢大家的帮助!

【讨论】:

  • 注意:这行得通,除非你不能调用 f.apply() 或 f.call() 或 f.toString(),所以这可能是个问题。
  • 请只显示Object.setPrototypeOf,不要提及已弃用的__proto__ :-)
  • @AlexMills 然后让obj 继承自Function.prototype
  • @Oriol 谢谢,我试过了,效果很好,很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2015-03-20
相关资源
最近更新 更多