Javascript は、そのオブジェクトにプロトタイプ ベースのモデルを使用します。それにもかかわらず、言語は非常に柔軟で、他の種類の構文を置き換える関数を数行で簡単に記述できます。たとえば、class
関数を作成して、継承やプライベート メンバーを含む標準クラスの動作をエミュレートできます。または、たとえば、curry
関数とその引数の一部を取り、部分的に適用された関数を返す関数を書くことによって、機能的なツールを模倣することができます。
逆のことをして、より古典的な言語でプロトタイプの方法を模倣することができるかどうか、私は疑問に思っていました. 特に、Python でプロトタイプを模倣することが可能かどうかについて少し考えていましたが、無名関数 (ラムダよりも一般的) がサポートされていないため、立ち往生しています。
クラスベースの言語、特に Python でプロポタイプを模倣する関数を書くことは可能ですか?
編集そのようなことを実装する方法の例をいくつか挙げましょう(しかし、私は実際にすべてを行うことはできません)。
まず、Javascript オブジェクトに最もよく似ているのは Python 辞書です。したがって、次のような単純なオブジェクトを持つことができます
foo = {
'bar': 1,
'foobar': 2
}
もちろん、メソッドを追加したいのですが、メソッドがラムダに収まる限り、これは問題ではありません
foo = {
'bar': 1,
'foobar': 2,
'method': lambda x: x**2
}
これで、インスタンスを呼び出すことができます
foo['method'](2)
>>> 4
メソッドとして任意の関数があれば、このように続けることができます。まず、内部の関数がそれ自体foo
にアクセスできるようにする必要があります。foo
それ以外の場合は、通常の関数であり、メソッドではありません。
makeObject
関数をに適用することでこれを行うことができると思います。これは値foo
をループし、foo
呼び出し可能な値が見つかるたびに、その__call__
属性を変更しfoo
て最初の引数として渡します。
この段階で、クラスを作成しなくても宣言できる自立型オブジェクトができます。
次にfoo
、関数の 2 番目の引数として渡すことができるプロトタイプを提供できるようにする必要がありmakeObject
ます。関数は次のように変更する必要がfoo.__getattr__
ありfoo.__setattr__
ます。属性が で見つからない場合は常にfoo
で検索する必要がありますfoo.prototype
。
だから、私はこれを実装できると思います.1つを期待してください.ラムダよりも複雑なメソッドを宣言する方法は、事前に宣言してオブジェクトに添付する以外には考えられません. 問題は、無名関数がないことです。Python の第一人者がこれを回避する巧妙な方法を見つけるかもしれないので、ここで質問しました。