2014-10-18 81 views
0

我需要创建一个具有setter和getter方法的私有变量的javascript函数。我想:作为一个对象在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); 

和其他隐藏。我得到一个错误类型错误:无法读取的未定义的属性“getSecret”,另一个不能调用方法setSecret

回答

0

createSecretHolder()return一个值,从而createSecretHolder(secret)回报undefined

因此var obj = createSecretHolder(secret);obj设置为undefined。因此,当您尝试访问obj.getSecret()时,出现错误“无法读取属性”getSecret'undefined“。

即使它返回了一个对象,但您已在function中声明getSecret使用var。以这种方式描述的变量被限定在该函数中。所以当你尝试在函数外部访问它时,就像你在obj.getSecret()中做的那样,这是行不通的。

您似乎也误解this如何工作。它不会创建一个私有变量。

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

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

而且'secret'不是一个字符串,可能,没有定义:) – Cheery 2014-10-18 03:46:09

+0

@Trott我只能假设返回secr的价值等getSecret被调用,那么我可以从createSecretHolder返回什么,以及添加get和set方法到对象的正确方法,以便它们可以在函数之外访问? – user137717 2014-10-18 03:46:14

+0

@Cheery秘密传入像var obj = createSecretHolder(6);或var obj = createSecretHolder(“ILikePizza”);我不明白你的意思,它不是一个字符串,可能是undefined – user137717 2014-10-18 03:49:13

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" 
+0

我明白你在说什么。但是,有一个简单的示例测试提供了var obj = createSecretHolder(5);它不使用新的关键字。我不知道如何返回obj,或者如果javascript只是将obj设置为等于函数本身。我不是很了解JavaScript中的“一切都是对象,一切都是功能”。 – user137717 2014-10-18 04:04:47

+0

@ user137717您可以使用提到的方法[Trott](http://stackoverflow.com/a/26436083/2202732)。它不需要'new'关键字。 'createSecretHolder'函数返回一个对象,其中包含获取/设置本地'secret'变量的方法。我以前没有使用过这种方法,但是它可以工作。 [**小提琴**](http://jsfiddle.net/oLa43vLp/) – akinuri 2014-10-18 04:17:13

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对象的方向,所以我经常使用这个轻的版本,将不会与其他东西冲突

相关问题