0

lick()はCatのプライベートメソッドです。残念ながら、Catのthis.pawにはlick()からアクセスできません。含まれているクラスのメンバー変数にアクセスできるプライベートメソッドを作成する簡単な方法はありますか?

<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p id="catStatus">???</p>
<script>
function Cat() {

    this.paw;

    var lick = function() {
        alert(this.paw);
        if(this.paw == "sticky") {
            alert("meow");
            document.getElementById("catStatus").innerHTML = "*Slurp*";
        }
    };

    this.beCat = function() {
        this.paw = "sticky";
        lick();
    }
}
var kitty = new Cat();
kitty.beCat();
</script>
</body>
</html>

結果

4

3 に答える 3

2

の値はthis、メソッドの呼び出し方法によって異なります。
オブジェクトインスタンスでメソッドを呼び出していないため、thisはグローバルオブジェクトになります。

this代わりに、変数に保存する必要があります。

function Cat() {
    this.paw = ...;

    var me = this;

    var lick = function() {
        alert(me.paw);
        if(me.paw == "sticky") {
            alert("meow");
            document.getElementById("catStatus").innerHTML = "*Slurp*";
        }
    };

    this.beCat = function() {
        this.paw = "sticky";
        lick();
    }
}
于 2012-11-18T13:35:12.643 に答える
1

これを解決する方法はいくつかあります。問題は、lick内のコンテキストがcatのインスタンスではないことです。次のいずれかを実行できます。

callメソッドを使用してコンテキストを設定します

this.beCat = function() {
    this.paw = "sticky";
    lick.call(this);
};

またはクロージャを使用する

var instance = this;
var lick = function() {
    alert(instance.paw);
    if(instance.paw == "sticky") {
        alert("meow");
        document.getElementById("catStatus").innerHTML = "*Slurp*";
    }
};
于 2012-11-18T13:38:30.103 に答える
1

これのコンテキストは、誰が関数を呼び出したかによって異なります。この場合はbeCatです。ただし、callを使用して、このスコープを明示的に指定できます。

あなたの場合:

    this.beCat = function () {
        this.paw = "sticky";
        lick.call(this);
    }

または、これを変数に格納できます。

このスコープ/それがどのように機能するかについての詳細はここで読むことができます。

于 2012-11-18T13:42:17.540 に答える