方法作为javascript中对象的属性

时间:2014-10-18 03:28:20

标签: javascript object

我需要使用具有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' undefined和另一个不能调用方法setSecret

3 个答案:

答案 0 :(得分:0)

createSecretHolder()没有return一个值,因此createSecretHolder(secret)会返回undefined

因此var obj = createSecretHolder(secret);obj设置为未定义。因此错误"无法读取属性' getSecret'未定义"当您尝试访问obj.getSecret()时。

即使它返回了一个对象,您也在getSecret内使用var声明了function。以这种方式描述的变量是作用于该函数的。因此,当您尝试在函数外部访问它时,就像在obj.getSecret()中那样,它不会起作用。

您似乎也误解了this的工作原理。它不会创建私有变量。

有很多方法可以做到这一点。这是一个:

function createSecretHolder(mySecret) {
    var secret = mySecret;
    return {
      getSecret: function(){
        return secret;
      },
      setSecret: function (mySecret){
        secret = mySecret;
      }
    };
}

答案 1 :(得分:0)

使用Constructor创建对象时,您需要使用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"

答案 2 :(得分:0)

查看prototypejs OO编程。

如果由于jQuery冲突而无法使用prototypejs,那么只有OO支持才能使用它的版本: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,所以我经常使用这个不会与其他东西冲突的轻型版本