我如何以不改變接口這項工作?
你不能,接口本質上是有缺陷的。這真的是你的問題的答案。
在繼續,雖然,以「我能做些什麼,而不是」:
如果你需要有一個初始化過程中調用回調函數,你需要將它傳遞給構造函數,而不是單獨爲onInit
方法。
class Foo {
constructor(callback) {
this.onInit =() => {
callback(); // Call the callback
return this; // Chaining seemed important in your code, so...
};
// Note: Constructors don't return anything
}
}
new Foo(() => console.log('baz'));
在你所說的評論:
我明白你的意思,但事實是,我的圖書館是new Something().onCreate().onUpdate()
這聽起來像你可能想採用builder pattern代替:
class Foo {
constructor(callbacks) {
// ...use the callbacks here...
}
// ...
}
Foo.Builder = class {
constructor() {
this.callbacks = {};
}
onCreate(callback) {
this.callbacks.onCreate = callback;
}
onUpdate(callback) {
this.callbacks.onUpdate = callback;
}
// ...
build() {
// Validity checks here, do we have all necessary callbacks?
// Then:
return new Foo(this.callbacks);
}
};
let f = new Foo.Builder().onCreate(() => { /*...*/}).onUpdate(() => { /*... */}).build();
...雖然是公平的,建造者模式的一個很大的優勢(雖然不是全部)可以通過JavaScript的只是傳遞對象爲constructor
直接做您的驗證那裏,如實現:
let f = new Foo({
onCreate:() => { /*...*/},
onUpdate:() => { /*...*/}
});
如果將「init」定義爲「當構造函數正在執行時」,那麼將回調設置爲構造函數的鏈接事件(根據定義在*構造函數後執行*)是簡單的矛盾,並且沒有合理的解決方法那。 – deceze
我明白了你的觀點,事實是我的庫是'new Something()。onCreate()。onUpdate()',它是有道理的,因爲它創建了實例,然後在實例之後設置你想要做的事情已創建(以及何時更新)。所以,「語法」,這是有道理的,我想找到一種方法來保持它.. –
*語法*如果我們可以寫*「計算機,喝杯茶」*,但實際上我們不得不屈服於編程語言的規則......;) – deceze