2

javascriptオブジェクトに属するJavaScript関数で、別のオブジェクトのプロパティの値を使用したいと思います。

var firstObject={
    says:"something"
}

var secondObject={
    speak:function(){console.log(this.saysToo)},
    saysToo:firstObject.says
}

secondObject.speak(); 

デバッガーで「secondObject」を検査すると、「saysToo」の値が正しくなります。ただし、「this.saysToo」を介してアクセスしようとすると、定義されていません。

2番目のオブジェクト内から最初のオブジェクトのプロパティにアクセスするにはどうすればよいですか?

4

1 に答える 1

5

firstObjectとは両方ともsecondObject別々のオブジェクトです。キーワードthisは、その実行コンテキストのオブジェクトを参照します。

<script>
var firstObject = {
    says: "something",
    test: function() {
        //this == firstObject
        console.log(this == firstObject); //shows: true
    }
}

var secondObject = {
    speak: function() {
        //this == secondObject
        console.log(this.saysToo);
    },
    saysToo: firstObject.says,
    test: function() {
        //this == secondObject
        console.log(this == secondObject); //shows: true
        console.log(this == firstObject); //shows: false
    },
}

secondObject.speak();

//this == window
console.log(this===window); //shows: true

console.log(typeof this.saysToo); //shows: undefined
//because "this.saysToo" is same as "window.saysToo" in this (global) context
</script>

関数呼び出しはcallapplyメソッドを使用して他のオブジェクトとバインドしthis、その関数を別のオブジェクトとして動作させることができます。

<script>
var firstObject = {
    says: "something",
    saysToo: "other"
}

var secondObject = {
    speak: function() {
        console.log(this.saysToo);
    },
    saysToo: firstObject.says
}

secondObject.speak(); //shows: "something"

//bind with "firstObject"
secondObject.speak.call(firstObject); //shows: "other"
</script>
于 2012-10-28T23:05:54.847 に答える