5

関数プロトタイプを JavaScript で拡張できるようにしたいと考えています (つまり、すべての関数に関数を追加します)。目的は、それを別の言語 (つまり、[この特定の設定では] 文字列を介してのみ通信できる ruby​​) 間で交換するための形式に変換することです。私はすでにシステムを持っているのでto_js、Ruby オブジェクトのto_rubyメソッドと JavaScript オブジェクトのメソッドを定義することで、他の型を渡すことができます。

Number.prototype.to_ruby = function () { return this.toString(); }

これは、私が望む他のすべてのもので機能しますが、関数では機能しません。次のようにして、クロムで動作させることができます。

_empty = function() {};
_empty.__proto__.to_ruby = function () {
    return 'JSFunction.new(' + this.toString().to_ruby() + ')';
};

しかし、これは IE では機能しません (これはシステムの要件です)。

ID などで関数を追跡しているオブジェクトがあることは知っていますが、それらを作成したのと同じインスタンスでそれらが使用されることを保証することはできません。

他のすべてが失敗した場合は、特別なケースを処理する関数を書くことができます (つまり、isFunction(instance) ? fn_to_ruby(instance) : instance.to_ruby().

4

3 に答える 3

5

Slaceが言ったように、メソッドをに追加することですべてのオブジェクトにメソッドを追加できますが、Object.prototypefor..inループに悪影響を与える可能性があるため、実際にはコーシャではありません。

あなたはそれを関数に追加することができますFunction.prototype

Function.prototype.to_ruby = function() {
  return this.toString();
}

ただし、組み込みオブジェクトを変更しないという一般的な規則があります。これは主に、いつ戻ってくるかわからないためです(たとえば、新しいバージョンのECMAScriptは同じ名前のプロパティを実装します)。おそらく、単一のtoRuby関数を作成する方がよいでしょう。

function toRuby(obj) {
  return obj.toString();
}

ただし、演​​算子を使用して文字列と連結し、メソッドを暗黙的+に呼び出すこともできます。toString

'' + obj; // returns obj.toString()

これは、上記の両方とまったく同じ結果を返します。あなたの選択。

于 2012-05-10T07:01:41.530 に答える
2

__proto__は標準プロパティではありません。このアプローチを試してください:

(function(){}).constructor.prototype.to_ruby = function(){
    return 'JSFunction.new(' + this.toString().to_ruby() + ')';
};
于 2012-05-10T06:27:50.440 に答える
-1

これ__proto__は JavaScript 標準の一部ではなく、一部のブラウザー メーカーが実装することを決定した疑似標準です。IEはそれを実装していません。

JavaScript 型システムの任意の型を変更する場合は、Objectプロトタイプを変更する必要があります。

Object.prototype.foo = function () { console.log('foo'); };
(1).foo();
'asd'.foo();
(true).foo();
({ bar: 'baz' }).foo();
于 2012-05-10T06:27:26.690 に答える