0

Javascript は初めてですが、C# と同様のセマンティクスを持つプログラミング言語に取り組んでおり、JS トランスコンパイラを追加したいと考えています。Javascript で OOP を実現するさまざまな方法を検討してきましたが、それが今後うまくいくかどうかは完全にはわかりません。

例から始めましょう。私の言語での非常に単純なコードは次のとおりです。

// test.fd
// this code will be put in package 'test'
class Foo
{
    float bar;

    - test
    {
        int x = 3;
    }
}

これは次のように出力されます。

var test = {
    function Foo(){
        this.bar = 0.0;
    };

    foo.prototype.test = function(){
        var x = 3;
    };
}

今、いくつか質問があります。現在、クラスをコンパイルすると、js 関数 'Foo()' が作成されます。これは実際にはコンストラクターとして動作しています。ユーザーがデフォルトのコンストラクターを作成しない場合は、デフォルトでこれを作成する必要があると考えています。その場合、それが使用されます。しかし、同じクラスに複数のコンストラクターが必要な場合はどうすればよいでしょうか? それらは異なる名前を持つ必要がありますか? また、コンストラクターごとにすべてのメソッドとプロパティを再作成する必要がありますか?

私の次の質問は、JS で継承を実現する最良の方法は何ですか? 私の言語は、すべてのメソッドが仮想であることを前提としているため、ポリモーフィズムが容易になるはずです。

皆さんありがとう、

4

1 に答える 1

2

@WaleedKhan が指摘しているように、よく知らない言語用のトランスコンパイラを構築するべきではありません。

まず、コンパイルされたコードは、あなたが思っていることをしません:

> var test = {
.    // Objects != namespaces
.    // Anything that is not a key: value pair is a syntax error.
.    function Test() {}
. }

SyntaxError: Unexpected identifier

JavaScript にはブロック スコープがないため、名前空間のような効果が必要な場合は、関数を使用する必要があります。

var test = (function(){
// This wrapper is an immediately invoked function expression (IIFE)
// It will act as a "namespace" inasmuch as functions and variables that are
// declared with `var` will not leak into the global scope.
// However, anything that you don't *explicitly* expose will be private.

function Foo() {
    this.bar = 0.0;
}

// JavaScript is case-sensative - foo != Foo.
Foo.prototype.test = function() {
    var x = 1;
};

return {
    Foo: Foo
};

})();

あなたの質問について:

はい、Foo(ある種の) コンストラクターです。ただし、JavaScript は、実行したい種類のディスパッチをサポートしていません。代わりに、渡された引数に応じて適切なコンストラクターを呼び出すラッパー関数が必要になります。

function FooFactory() {
    if (typeof arguments[0] === "string") {
        return new FooString(arguments[0]);
    }
    else {
        return new FooObject(arguments[0]);
    }
}

これを扱うのは急速に困難になります (ただし、このようなディスパッチを容易にするライブラリがいくつかあります)。

プロトタイプの継承を適切に行う方法については、JavaScript でカスタム オブジェクトを「適切に」作成する方法に対する @bobince の回答を見たことがありますか?

最後に、JavaScript クロージャーはどのように機能しますか?をご覧になることをお勧めします。JavaScript 言語のトリッキーな部分に関するKangax の優れた 記事(彼のES5 互換性表も見逃せません)。

ここまでたどり着いたら、冒険を頑張ってください!

于 2012-10-27T20:55:15.037 に答える