簡體   English   中英

如何從JavaScript模塊中的私有和公共函數訪問公共財產?

[英]How to access public property from private and public functions in a JavaScript module?

我想知道如何從JavaScript模塊中的私有和公共函數訪問公共屬性?

例如,如果這是我的模塊:

var PersonModule = (function(){

    var sayHello = function(){
        alert("Hello " + name);
    }

    var privateChangeNameToBob = function(){
        this.name = "Bob";
    }

    var changeName = function(){
        privateChangeNameToBob();
    }

    return {
        name: "",
        sayHello: sayHello,
        changeName: changeName
    }   
})();

sayHellochangeName函數均changeName正常工作,因為我不知道如何訪問公用name屬性。 有沒有辦法做到這一點? 我已經通過將私有變量與getter和setter結合使用來解決此問題,但我想知道如果沒有它們,是否可以做到這一點。

您需要對結果對象的引用:

var PersonModule = (function(){
    function sayHello() {
        alert("Hello " + person.name);
    }
    function privateChangeNameToBob() {
        person.name = "Bob";
    }
    function changeName() {
        privateChangeNameToBob();
    }

    const person = {
        name: "",
        sayHello,
        changeName
    };
    return person;
})();

當然,考慮到您的單例IIFE模塊,您也可以直接引用PersonModule.name

以這種方式,您將其用作公共變量時使用的名稱變量與sayHello方法中的名稱變量不同。 您必須了解這是MODULE,而不是需要實例化的類。 IIFE已經為您實例化了它。 要執行您想要的操作,可以使用以下模型。 使用self. 在公共方法/變量中,在私有方法中什么也沒有。 這樣就可以了。

 var PersonModule = (function(){ var self = {}; var privateChangeNameToBob = function(){ self.name = "Bob"; }; self.sayHello = function(){ console.log("Hello " + self.name); }; self.changeName = function(){ privateChangeNameToBob(); }; self.name = ""; return self; })(); PersonModule.name = 'Test'; PersonModule.changeName(); PersonModule.sayHello(); 

您需要在閉包內部聲明屬性。 查看此示例以更好地理解它:

var ClassName = function(constructorParam) {
 
    var privateProperty = 'Im a private property';
    this.publicProperty = 'Im a public property';
 
    function privateMethod() {
        console.log('Private method');
    }
 
    this.publicMethod = function() {
        console.log('Public method');
        // We can call private properties
        console.log(privateProperty);
        // Either private methods
        privateMethod();
    }
 
}
 
var instance = new ClassName('Here goes something to constructor');
instance.publicMethod();

您在privateChangeNameToBob this.name privateChangeNameToBob name設置為該函數的屬性,而不是模塊的屬性。 您可以這樣使用它:

var PersonModule = (function(){
    var name = '';
    //...
    var privateChangeNameToBob = function(){
        name = "Bob";
    }
    return {
        name: name,
        sayHello: sayHello,
        changeName: changeName
    };
})();

在這里查看小提琴: https//jsfiddle.net/yv8uqh5y/

最后一點是您可能會發現有用的設計模式。 您可以在模塊范圍內聲明一個名為base或類似名稱的變量,如下所示:

var PersonModule = (function(){
    var base = {};

    base.name = '';

    base.sayHello = function() {/* ... */};
    //...

    return {
        name: base.name,
        sayHello: base.sayHello,
        changeName: base.changeName
    };
})();

在這里查看小提琴: https//jsfiddle.net/k63u9bfo/

這樣,您可以引用模塊的基礎,而不必擔心this映射到什么(例如,如果您試圖在模塊方法中聲明的匿名函數中使用this內部訪問模塊。

暫無
暫無

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

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