1

私は Require.js をよく理解していないと思うので、下の例のように (グローバルに) firstName と lastName を変更できる理由を尋ねたかったのです。

Require.js は、グローバル スコープの汚染を回避するための処理を行うべきではありませんか? オブジェクトのコンテンツを変更するためではなく、オブジェクトを作成するためのインターフェイスを提供しているだけです。どうもありがとう。

// someModule.js
define([], function() {
    function Employee(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;        
    }

    Employee.prototype.getName = function() {
        return this.firstName = ' ' = this.lastName;
    }

    return {
        createEmployee: function(fName, lName) {
            return new Employee(fName, lName);
        };
    };
});

// main.js
require(['jquery', 'someModule'], function($, someModule) {
    $(function() {
        var x = someModule.createEmployee('John', 'Doe');
        document.write(x.getName() + '<br>');
        x.firstName = 'Some other name';
        x.lastName = 'Some other surname';
        document.write(x.getName());
    });
});

出力は次のとおりです。
John Doe
他の名前 他の姓

4

3 に答える 3

2

グローバル リークとプロパティの可視性を混同していると思います。 リークfirstNameされてlastNameいません-それらは公開されており、変更可能(変更可能)です。それらを隠したい場合は、次のようにすることができます。

function Employee(firstName, lastName) {    
    this.getFirstName = function () { return firstName; };
    this.getLastName = function () { return lastName; };
}

Employee.prototype.getName = function () {
     return this.getFirstname() + ' ' + this.getLastName();
};
于 2013-03-21T17:54:18.677 に答える
1

ここではグローバル スコープを汚染しません。コードは無名関数 (クロージャ) 内で実行され、ウィンドウ グローバル オブジェクトには何もバインドされません。問題ありません。

于 2013-03-21T17:48:51.990 に答える
1

作成したオブジェクトには、"firstName" と "lastName" というプロパティがあります。あなたのコードは、これらのプロパティの変更を防ぐために何もしませんでした。

新しい JavaScript 実装では、それを行う方法がありますが、Requirejs が自動的に行うことはありません (少なくとも、大幅な再設計または拡張プロジェクトがなければ)。

具体的には、このdefinePropertyメソッドを使用すると、読み取り専用のプロパティを作成できます。これで、すべてのコードがプロパティを変更できなくなります。オブジェクトの制御下にあるプロパティが必要な場合は、@ c24w が別の回答で示唆しているような手法を使用できます。

于 2013-03-21T17:50:17.470 に答える