5

javascriptでモジュールパターンを使用する場合、コンストラクターを定義する必要があります。コンストラクターをグローバルではなく、標準のモジュールパターンに適合させたいです。

なぜこのようなものが機能しないのですか、それは完全で完全にナンセンスですか?

var HOUSE = function() {
    return {
        Person: function() {
            var self = this;
            self.name = "john";
            function name() {
                return self.name;
            }
        }
    };
}();

var me = new HOUSE.Person();
alert(me.name());
4

3 に答える 3

3

あなたのコードはほとんど問題ありません。ただし、関数name()は公開されていませんでしたが、変数が公開されていたため、変数を実行しようとしてエラーが発生しました。オブジェクトに関数を追加し、getName代わりにそれを呼び出します。

var HOUSE = function() {
    return {
        Person: function() {
            var self = this;
            self.name = "john";
            self.getName = function() {
                return self.name;
            }
        }
    };
}();

var me = new HOUSE.Person();
alert(me.getName());

http://jsfiddle.net/8nSbP/

于 2012-01-19T16:25:20.313 に答える
2

varand function foo() {}(後者は宣言として、function foo() {}割り当てずに「ただ」を意味する)を使用して、ローカルシンボルを作成します。したがって、この関数はコンストラクターの外部では使用できません。

公開したい(公開したい)ものは何でも、this(またはself定義したので)に割り当てる必要がありますself = this

self.getName = function() {
    return self.name;
};

すでに使用nameしているので、関数に別の名前を付けました。文字列をローカルにし、関数を公開したい場合nameは、競合がないため、同じ名前にすることができます。例えば:

var name = "john";

self.name = function() {
    return name;
};
于 2012-01-19T16:23:24.233 に答える
1

メソッドを取り出して、Personプロトタイプにアタッチする必要があります。ただし、そうすると、nameプロパティとnameメソッドが機能しなくなります。そのため、後者の名前を変更することを検討してください。

HOUSE.Person.prototype.getName = function(){
    return this.name;
}

thisまたは、それをにアタッチして、getNameを特権メソッドにすることもできます。

  Person: function() {
        this.name = "john";
        this.getName = function() {
            return this.name;
        }
    }
于 2012-01-19T16:22:42.733 に答える