2012-01-19 7 views
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()); 
+0

は 'self.name'が文字列'「ジョン」です 'あなたはそれを呼び出すことはできませんので。ローカル関数 'name'はどこにもエクスポートされないことに注意してください。 – Raynos

+0

更新された質問ですが、それは完全に良い答えを作りました。 – zode64

答えて

1

このメソッドを取り出し、Personプロトタイプに添付する必要があります。あなたが行うときしかし、あなたはnameプロパティ、および動作しません名前のメソッドを、持っているので、後者の

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

の名前を変更を検討OR、あなただけのthisに添付でき、のgetName aを作ってあげます特権方法:

Person: function() { 
     this.name = "john"; 
     this.getName = function() { 
      return this.name; 
     } 
    } 
+0

文法の問題があると思います。 :) – pimvdb

+0

'var self = this'を割り当てるので、これは変更されません。 – zode64

+0

これは良い習慣とも考えられますか? – zode64

2

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

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

注意をので、私は別の名前の関数を与えた:あなたは(あなたがself = thisを定義したため、またはself)、あなたはthisに割り当てる必要があります(公開する)公開したいものは何でも

name文字列をローカルにして、その関数を公開する場合は、競合がないので同じ名前を使用できます。例:

var name = "john"; 

self.name = function() { 
    return name; 
}; 
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/

+1

これは良い習慣と考えられますか? – zode64

関連する問題