[英]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
}
})();
sayHello
或changeName
函數均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.