0

lick() 是 Cat 的私有方法。不幸的是,在 lick() 中无法访问 Cat 的 this.paw。有没有一种简单的方法来创建一个可以访问其包含类的成员变量的私有方法?

<!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

this 的上下文取决于谁调用了该函数。在这种情况下,它是 beCat。但是,您可以使用 call 显式指定 this 范围。

在你的情况下:

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

或者您可以将 this 存储在变量中。

您可以在此处阅读有关此范围/如何工作的更多信息。

于 2012-11-18T13:42:17.540 回答