2012-03-18 20 views
2

内litteralオブジェクトのプロパティの値を取得するにはどのように私はこれをしたいです。どのようにその価値を持つか?は自動実行方法

更新:より多くの意味を作るために、私はむしろ、このすなわち自動inialisationをしたい:

var person = { 
    name: "", 
    __test__: (function() {name = "john"})() 
}` 

「ジョン」はモックアップオブジェクト、私のポイントは私が何であれ、データベースから現実の世界に来ることができます自己完結した方法でこれを行うには、テストを外部オブジェクトから呼び出さないでください。

+0

私のために定義されています。どのような設定を使用していますか? – Blender

+0

コードの意味は? – gdoron

+0

@gdoron私の更新を参照 – user310291

答えて

4

あなたは、オブジェクトリテラルを使用してこれを行うことはできません。 thisは、personを参照しています。評価中にリテラルが評価されます。thisは、親スコープを指します。 thisが現在のスコープ(つまり、関数のスコープ)を参照していることを確認する関数にオブジェクト構造をラップすることができます。以下のような何か:

var person = function(){ 
    this.name = 'John'; 
    this.__test__ = (function(){alert(this.name);}()); 
    return this; 
}(); 

または関数のスコープ内の変数を使用して:

var person = function(){ 
    var _name = 'John' 
     ,_test = (function(){alert(_name);}()); 
    return { name: _name, __test__: _test }; 
}(); 

以上の汎用的なファクトリ関数で物事をラップ:最後に

function objFactory(obj){ 
    var nwObj = {}; 
    for (var l in obj){ 
     if (obj.hasOwnProperty(l)){ 
      if (obj[l] instanceof Function && /^auto_/i.test(l)){ 
      nwObj[l.replace(/^auto_/i,'')] = obj[l].call(nwObj); 
      } 
      else { 
      nwObj[l] = obj[l]; 
      } 
     } 
    } 
    return nwObj; 
} 
//=> usage 
var person = objFactory(
       { name: '', 
       auto_name: function(){ 
          this.name='John'; 
          return this.name; 
          } 
       } 
      ); 
alert(person.name); //=> John 

そして、(誰もがに同意しますこれでロードハンドラを作成することができますObject.prototype

Object.prototype.load = function(){ 
    for (var l in this){ 
     if (this.hasOwnProperty(l) 
      && this[l] instanceof Function 
      && /^auto_/i.test(l)) { 
      this[l].call(this); 
      delete this[l]; 
     } 
    } 
    return this; 
} 
//=> usage 
var person = { 
       name: '', 
       auto_name: function(){this.name='John';} 
      }.load(); 
alert(person.name); //=> John 
+0

ありがとう、私はそれについて考えます。それにもかかわらず、リテラルオブジェクトは軽い構文であり、コンストラクタを持つフルブロークラスよりもあまり冗長ではないので、私はそうすることができます。そして、私は、litteralオブジェクトがなぜ関数を使って構築されたオブジェクトと異なって動作するのか理解できません。 – user310291

+0

@ user310291あなたは[this](http://jsfiddle.net/U8kMP/1/)fiddle – gdoron

+0

@ user310291を使用することができます:この場合、それは完全に吹かれたコンストラクタではありませんが(javascriptはクラスを分かっていません)、Immediately Invoked (匿名)機能です。スコープをより明確に示す例を追加しました。 – KooiInc

1

自動実行機能とコードの範囲は、window(私はそれが機能していないpersonと呼ばれる人であるbecuaseそれはだと思う)です。

だから私はできないと思います(このように)。

見るこのDEMO

はなぜ代わりにこれを使用することはありません。

var person = { 
    name: "John", 
    __test__: function() {alert(this.name)} 
} 
person.__test__(); 
+0

これは、外部オブジェクトからテストを呼び出さない自己完結型の方法で行いたいと思います。 – user310291

+0

@ user310291なぜKooilncの答えはこの必要性のために十分ではありませんか? – gdoron

+0

はいKooilncはそれを行うことができます。私はリテラルオブジェクトを使用できるようにしたいと思っています。これだけの理由で文法を変えなければならないと愚かに聞こえる。 – user310291

1

この操作を行います。

var person = { 
    name: "John", 
    __test__: function() { alert(this.name) } 
}; 
person.test(); 

これは person.test()で実行することができ person.testに無名関数を割り当てます。元のコードでは、 person.testには未定義の匿名関数の結果が割り当てられています(何も返されなかったため)。

JavaScriptのクロージャと匿名関数が動作します。このは、匿名関数を実行する際にコンテキストが失われます。

+0

それは問題ではありません.____ test__は戻り値が重要ではないので値を割り当てられます。外部オブジェクトからテストを呼び出すのではなく、自己完結型の方法でこれを実行したいので、オブジェクトの外側を呼び出す必要はありません。 – user310291

1

オブジェクトを作成する前にアクセスしようとしている可能性があります。次に、無名関数を作成してwithThatを実行します。値はオブジェクトへのコンテキストなしで評価され、適切なキーとともに格納されます。

var func = function() {return this;}; 
// when invoked as such 
func(); 
// will return global namespace (or window in a browser). 

var obj = {"func": func}; 

obj.func(); 
// now calling func on obj so this is now obj and returns obj 

たぶん、あなたは、コンストラクタで欲しいものをacheiveできます

function MyObject() { 

    this.name = "John"; 
    this.__test_func__ = function() {alert(this.name);}; 
    this.__test__ = this.__test_func__(); 

    // or you could try passing in your object explicitly 
    this.__test__ = (function(pseudo_this){alert(pseudo_this.name);})(this); 
} 

var obj = new MyObject(); 

もうひとつは、アラートが戻り値を持っていません(それはundefinedを返します)。私はあなたがそれを知っていたと仮定し、建設の途中でオブジェクトの状態を調べようとしていました。オブジェクトの内容を指定するだけではなく、複雑な作業をしたい場合は、リテラルではなくコンストラクタを使用する必要があります。

+0

すべての説明をOKにしていただきありがとうございます - 残念なことに、1つの良い答えのみをマークすることができます - 私はリテラルオブジェクトではできませんが、コンストラクタを使用することはできません。 – user310291