簡體   English   中英

方法作為javascript中對象的屬性

[英]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.

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