2

これは Javascript の醜いビットです。回避策を見つけるとよいでしょう。

Javascript にはクラスがありません。これは良いことです。しかし、オブジェクト間のフォールバックをかなり醜い方法で実装しています。基本的な構造は、プロパティが見つからない場合に別のオブジェクトにフォールバックする 1 つのオブジェクトを持つ必要があります。

したがって、aフォールバックしたい場合はb、次のようにします。

a = {sun:1};
b = {dock:2};
a.__fallback__ = b;

それから

a.dock == 2;

ただし、Javascript は代わりにnew演算子 andを提供しますprototypes。そのため、はるかにエレガントではありません。

function A(sun) {
   this.sun = sun;
};
A.prototype.dock = 2;
a = new A(1);

a.dock == 2;

しかし、優雅さは別として、これは厳密には強力ではありません。これは、A で作成されたものはすべて同じフォールバック オブジェクトを取得することを意味するためです。

私がやりたいことは、Javascript をこの人為的な制限から解放し、個々のオブジェクトに別の個々のオブジェクトをフォールバックとして与える能力を持つことです。そうすれば、理にかなっている場合は現在の動作を維持できますが、それが理にかなっている場合はオブジェクト レベルの継承を使用できます。

私の最初のアプローチは、ダミーのコンストラクター関数を作成することです。

function setFallback(from_obj, to_obj) {
    from_obj.constructor = function () {};
    from_obj.constructor.prototype = to_obj;
}

a = {sun:1};
b = {dock:2};
setFallback(a, b);

しかし残念ながら:

a.dock == undefined;

これが機能しない理由、または実装の解決策はありsetFallbackますか?

(これがプラットフォームに依存する場合に備えて、node.js経由でV8で実行しています)


編集:

これに対する部分的な解決策を以下に投稿しました。これは V8 の場合に機能しますが、一般的ではありません。より一般的な解決策をいただければ幸いです。

4

2 に答える 2

5

あなたはただ使うことができますObject.create。これは ES5 の一部であるため、一部のブラウザーでは既にネイティブで利用できます。私はそれがまさにあなたが望むことをすると信じています。

于 2010-05-10T18:27:38.647 に答える
0

さて、さらに調査とクロスプラットフォームのチェックを行い、さらに情報があります(ただし、一般的な解決策ではありません)。

一部の実装には、基本的に私が自分で行ったことがあります__fallback__。それは呼ばれ__proto__、ほぼ完璧です:

a = {sun:1};
b = {dock:2};
a.__proto__ = b;

a.dock == 2;

新しいオブジェクトが構築されたときに何が起こるかは、おおよそ次のようです。

a = new Constructor(...args...);

以下とほぼ同等の動作を生成します。

object.constructor = constructor;
object.__proto__ = constructor.prototype;
constructor.call(this, ...args...);

したがって、後になってオブジェクトのコンストラクターまたは constructor.prototype を調整しても効果がないのは不思議ではありません__proto__。設定は既に設定されているからです。

現在、v8 アプリケーションでは を使用できます__proto__が、これが IE VM で公開されていないことは理解しています (Windows を実行していないため、わかりません)。したがって、これは問題の一般的な解決策ではありません。

于 2010-05-10T18:31:39.027 に答える