比方說,我有這個簡單的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? –