我需要使用具有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
答案 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,所以我经常使用这个不会与其他东西冲突的轻型版本