2017-04-21 9 views
3

"property"this[property]にコンソールで入れ替えたのとは違い、私は両方とも同じ表現を参照していると思いますが、後者は関数を呼び出すと[オブジェクト、オブジェクト]を与えます。Javascriptオブジェクトの列挙

var rockSpearguns = { 
    Sharpshooter: {barbs: 2, weight: 10, heft: "overhand"}, 
    Pokepistol: {barbs: 4, weight: 8, heft: "shoulder"}, 
    Javelinjet: {barbs: 4, weight: 12, heft: "waist"}, 
    Firefork: {barbs: 6, weight: 8, heft: "overhand"}, 
    "The Impaler": {barbs: 1, weight: 30, heft: "chest"} 
}; 

rockSpearguns["listGuns"] = function(){ 
    for (var property in this) { 
     if(this[property]["heft"]!==undefined){ 
      console.log("Behold! " + this[property] + ", with " + 
      this[property]["heft"] + " heft!"); 
     } 
    } 
} 

rockSpearguns["listGuns"](); 
+0

あなたは 'this [" property "]'と 'this [property]'の違いは何ですか? –

+0

nope、コンソール内のプロパティとこの[プロパティ]は –

答えて

2

propertyはすでに文字列であるオブジェクトbeignループ(​​3210、"Pokepistol"、...)の鍵となります。

this[property]は、すべてのオブジェクトであるオブジェクトの値になります。オブジェクトを文字列に連結するとき、オブジェクトはその関数toStringを呼び出して文字列にキャストされます。だから、:"[object Object]"を返します。この場合、

var obj = {}; 
var string = "Hello. I'm " + obj.toString(); 

obj.toString()

var obj = {}; 
var string = "Hello. I'm " + obj; 

は同じです。

ブラケットとドット表記については、MDNのドキュメントをご覧ください。

rockSpearguns["listGuns"]()コールが言って別の方法である:

2

コンソールや簡単なスクリプト内でthisにアクセスすると、それはとてもwindow範囲内である、変数へのアクセスと同じである、windowを指します。

var a = 123; // variable `a` is bound to `window` 
console.log(a); // 123 
console.log(window.a); // 123 
console.log(this.a); // 123 

しかし、あなたは、関数やオブジェクトの内側にある、thisは独自のコンテキストを参照:

この程度
function test() { 
    this.a = 123; 
    console.log(a); // 123 
    console.log(this.a); // 123 
    console.log(this); // test {a: 123} 
} 

new test(); // to create new context for this function, we need to call `new`, otherwise it will also be `window` 

console.log(typeof a); // undefined 
console.log(this.a); // undefined 
console.log(this); // window 

より:thisrockSpearGuns対象となりますforループ内http://ryanmorr.com/understanding-scope-and-context-in-javascript/

+0

ですが、コンソールを除いては同じですか? –

+0

うまく 'bind'メソッドで変更することができますが、関数やオブジェクトの中にいない場合は' this'が 'window'を参照します。 –

+0

ありがとう、私は後でそれを試してみます。 –

2

。この場合、this[property]は、例えばFireforkオブジェクトを参照します。 this[property]の代わりにpropertyを使用する必要があります。

このお試しください:

var rockSpearguns = { 
 
    Sharpshooter: {barbs: 2, weight: 10, heft: "overhand"}, 
 
    Pokepistol: {barbs: 4, weight: 8, heft: "shoulder"}, 
 
    Javelinjet: {barbs: 4, weight: 12, heft: "waist"}, 
 
    Firefork: {barbs: 6, weight: 8, heft: "overhand"}, 
 
    "The Impaler": {barbs: 1, weight: 30, heft: "chest"} 
 
}; 
 
    
 
rockSpearguns["listGuns"]=function(){ 
 
    for (var property in this) { 
 
    if(this[property]["heft"]!==undefined){ 
 
     console.log("Behold! " + property + ", with " + 
 
     this[property]["heft"] + " heft!"); 
 
    } 
 
    } 
 
} 
 
    
 
rockSpearguns["listGuns"]();

+0

私はそれがforループではなくfor inループであると誤解していないなら:)。また、JS Binのようなサイトでオブジェクトやオブジェクトのプロパティにアクセスする際に、ブラケットとドット表記の組み合わせを常に使用する必要があるのはなぜですか? –

+0

これを確認してください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors 変数を使用してオブジェクトのプロパティを識別する場合は、角括弧を使用する必要があります。 – kotapeter

2

ことのは、それが少しずつ解剖してみましょう rockSpearguns.listGunsを(); これは、 "this"のコンテキストがrockSpeargunsオブジェクト(コールサイト)に設定されていることを意味します。

JSはこの[property]値を評価しようとすると、このオブジェクトの値がrockSpeargunsにバインドされていることを確認し、「property」はオブジェクトプロパティの列挙された値(for-inループによる)です。しかし、この[プロパティ]は単にthis.property(ドット表記法)を意味します。 この場合、this.propertyはオブジェクトです(Sharpshooterなど) 文字列を連結しようとすると、Sharpshooterオブジェクトは、[オブジェクト、オブジェクト]を返すtoString()メソッドを呼び出して文字列に変換する必要があります。

関連する問題