簡體   English   中英

從JavaScript中的私有方法訪問成員變量

[英]Access a member variable from a private method in JavaScript

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>

結果

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();
    }
}

有兩種解決方法。 問題在於,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*";
    }
};

其上下文取決於誰調用了該函數。 在這種情況下,它就是beCat。 但是,您可以使用call明確指定此范圍。

在您的情況下:

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

或者,您可以將其存儲在變量中。

您可以在此處閱讀有關此范圍/如何工作的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM