2017-05-12 73 views
0

比方说,我有这个简单的id功能:使功能性功能OO功能的Javascript

let id = a => a 

,现在我想使它成为一个面向对象式的方法,而无需重新定义,即

let a = {foo:5} 
a.id() // {foo:5} 

如何将第一个函数转换为第二个函数?有没有这样做的黑客?我尝试使用bind,但它似乎没有工作。

+0

你问如何在每个对象上放置一个函数?不要这样做。 – SLaks

+2

这感觉就像一个X/Y问题。你需要做X,认为Y是这样做的方式,并且询问了Y.什么是X? –

回答

1

要变换正常功能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在这个例子中的作品只是一个巧合。

1

可以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); }; 

...虽然,一个人的取决于它的调用方式。