比方说,我有这个简单的id
功能:使功能性功能OO功能的Javascript
let id = a => a
,现在我想使它成为一个面向对象式的方法,而无需重新定义,即
let a = {foo:5}
a.id() // {foo:5}
如何将第一个函数转换为第二个函数?有没有这样做的黑客?我尝试使用bind
,但它似乎没有工作。
比方说,我有这个简单的id
功能:使功能性功能OO功能的Javascript
let id = a => a
,现在我想使它成为一个面向对象式的方法,而无需重新定义,即
let a = {foo:5}
a.id() // {foo:5}
如何将第一个函数转换为第二个函数?有没有这样做的黑客?我尝试使用bind
,但它似乎没有工作。
要变换正常功能id
成隐含取决于接收器(由this
引用)的功能,你需要一个辅助功能分配给你的原型:
class Cons {
constructor(x) { this.foo = x }
asMethod(f) { return (...args) => f(this, ...args) }
}
const o = new Cons(5);
const id = x => x;
console.log(
o.asMethod(id)()
);
这并未虽然没有多大意义!你的函数将不得不期待接收者作为他们的第一个参数,因此是非常具体的,这是通用的相反。那id
在这个例子中的作品只是一个巧合。
您可以与bind
做到这一点:
let id = a => a;
// ...
let a = {foo:5};
a.id = id.bind(null, a);
a.id(); // {foo:5}
从技术上讲,虽然bind
返回一个新的功能。
我想你排除了这一可能性,但交替,当然,只是定义另一个箭头:
a.id = _ => id(a);
或非箭头
a.id = function() { return id(this); };
...虽然,一个人的取决于它的调用方式。
你问如何在每个对象上放置一个函数?不要这样做。 – SLaks
这感觉就像一个X/Y问题。你需要做X,认为Y是这样做的方式,并且询问了Y.什么是X? –