[英]methods as properties of an object in javascript
我需要創建一個具有setter和getter方法的私有變量的javascript函數。 我試過了:
function createSecretHolder(secret) {
this._secret = secret;
var getSecret = function(){
return this._secret;
}
var setSecret = function(secret){
this._secret = secret;
}
}
並帶有以下版本:
this.getSecret = function()...
和
this.seSecret = function()...
它沒有通過代碼大戰的測試套件。 就像是
var obj = createSecretHolder(secret);
obj.getSecret();
obj.setSecret(newSecret);
和其他隱藏的。 我收到錯誤TypeError:無法讀取未定義的屬性'getSecret',另一個無法調用方法setSecret
createSecretHolder()
不return
值,因此createSecretHolder(secret)
返回undefined
。
所以var obj = createSecretHolder(secret);
將obj
設置為undefined。 因此,當您嘗試訪問obj.getSecret()
時出現錯誤“無法讀取未定義的屬性'getSecret'”。
即使它返回了一個對象,您也已在function
內部使用var
聲明了getSecret
。 以這種方式描述的變量僅限於該函數。 因此,當您嘗試在函數外部訪問它時(如在obj.getSecret()
所做的obj.getSecret()
,將無法正常工作。
您似乎也誤解了this
工作原理。 它不會創建私有變量。
有很多方法可以做到這一點。 這是一個:
function createSecretHolder(mySecret) {
var secret = mySecret;
return {
getSecret: function(){
return secret;
},
setSecret: function (mySecret){
secret = mySecret;
}
};
}
使用構造函數創建對象時,需要使用new
關鍵字。
在構造函數內部,您可以使用this._secret = secret
設置屬性。 可從外部訪問。 它應該是var _secret = secret
。
您還可以在對象內部創建局部函數以獲取/設置_secret
。 它們應該是對象的方法。 見下文。
// object constructor
function createSecretHolder(secret) {
// local variable. it isn't accessible from outside
var _secret = secret;
// method to get the secret
this.getSecret = function() {
return _secret;
}
// method to set the secret
this.setSecret = function(secret){
_secret = secret;
}
}
// create new "createSecretHolder" object
var secret = new createSecretHolder("secret 1");
secret.getSecret(); // returns "secret 1"
secret.setSecret("secret 2");
secret.getSecret(); // returns "secret 2"
研究prototypejs OO編程。
如果由於jQuery沖突而無法使用prototypejs,則此處僅提供面向對象的版本: https : //github.com/Prescia/Prototypejslt
您可能會看起來像:
createSecretHolder= Class.create();
createSecretHolder.prototype = {
_secret: 0,
othervariable: true,
initialize: function(inSecret) { // this is the constructor on prototypejs
this._secret = inSecret;
}
}
// Create instance:
var myInstance = new createSecretHolder(5);
// so this should alert "5":
alert(myInstance._secret);
我不能沒有prototypejs Object Orientation,所以我經常使用不會與其他東西沖突的輕量級版本
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.