2017-05-12 70 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); }; 

...雖然,一個人的取決於它的調用方式。