0

TypeScript を発見した後、私はオンライン コンパイラをいじってみたところ、結果として得られた JavaScript コードを見て、関数式について疑問に思いました。

シンプルな TypeScript クラス:

class Person {
    firstName: String = "John";
    lastName: String = "Doe";
}

次の JavaScript コードが生成されます。

var Person = (function () {
    function Person() {
        this.firstName = "John";
        this.lastName = "Doe";
    }
    return Person;
})();

もっと単純なもので十分だったのに、なぜ彼らは自己実行機能を選んだのか不思議に思いました。変数と同じ名前の内部関数の目的は何ですか?
そして、なぜ彼らは次のようなもっと単純なものを採用しなかったのですか?

var Person = function() {
    this.firstName = "John";
    this.lastName = "Doe";
};

あるいは:

function Person() {
    this.firstName = "John";
    this.lastName = "Doe";
}


私が知る限り、グローバルスコープで関数式を使用しても利点はなく、関数を宣言する前に呼び出すことができないという欠点だけがあります。

4

3 に答える 3

2

継承に役立ちます。これにより、名前を変更して基本クラスをキャプチャできるようになり_super、コード生成に役立ちます。

class Foo{

}

class Bar extends Foo{

}

になります:

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var Foo = (function () {
    function Foo() {
    }
    return Foo;
})();

var Bar = (function (_super) {
    __extends(Bar, _super);
    function Bar() {
        _super.apply(this, arguments);
    }
    return Bar;
})(Foo); // Notice base class is captured here

これはJSでも良い習慣です。たとえば、Foo代わりにこの例を使用し続け_super、基本クラスを変更する場合、回避できる頭痛の種がたくさんあります。

于 2013-11-15T03:47:40.283 に答える
1

宣言が実行される前にクラスを呼び出せるようにしたくはありません。次のコードを検討してください。

class Person {
    static nameSeparator = ' ';

    public fullName: string;

    constructor(public firstName, public lastName) {
        this.fullName = firstName + Person.nameSeparator + lastName;
    }
}

そして、その生成されたフォーム:

var Person = (function () {
    function Person(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.fullName = firstName + Person.nameSeparator + lastName;
    }
    Person.nameSeparator = ' '; // <-- Important!
    return Person;
})();

指定された行の前に誤って実行されるコードを未定義の動作 (この場合、Person.fullName は "JohnundefinedSmith") で実行するか、単に失敗するか?

それ以外の場合、クラスはまったく機能しません。

class Person {
    constructor(public firstName, public lastName) {
        // Will fail until Person.prototype.getFullName gets set
        console.log('New person, name = ' + this.getFullName());
    }

    getFullName() {
        return this.firstName + " " + this.lastName;
    }
}
于 2013-11-15T03:33:49.537 に答える
-1

これにより、いくつかのプライベート変数を作成できます。

JS で:

var Person = (function () {
    var firstName, lastName; //static private vars
    function Person(fName, lName) {
        firstName = fName;
        lastName = lName;
    }
    return Person;
})();
于 2013-11-15T03:18:41.493 に答える