编辑变量但不直接分配它

时间:2014-02-03 14:42:43

标签: javascript jquery

首先,我想为我糟糕的英语道歉,

我正在用jquery / javascript创建一个小游戏,但现在我想创建一些'升级',但是我有一个小问题。首先,我不知道具体如何,但我需要这样的东西

var clicker = 1;

clicker.upgrade(value, text, content); 

这样的事情和来自(clicker).upgrade的可变点击者应该被编辑。在升级中,应该有一个函数调用var(clicker)并编辑名为clicker的变量的值。

我需要它以方便使用,我可以将点击器编辑成其他内容。

感谢您阅读本文

2 个答案:

答案 0 :(得分:1)

就像Brad Christie建议你可以在Number对象的原型上创建一个升级方法,所以如果你添加这一行:

Number.prototype.upgrade = function(a) {clicker = a}

然后你可以这样做:

var clicker = 3;
clicker.upgrade(4); // Now clicker == 4

据说,这是一个黑客,也是一个丑陋的黑客。有两个原因,首先,因为你要小心改变内置对象的原型。主要原因是您可能会覆盖本机属性(或您不知道的未来属性)。注意:向Object.prototype添加属性也会有更多问题。 关于这个hack的另一个丑陋的地方是变量名(clicker)被硬编码到升级函数中。这将是一个问题,例如,如果你更改了点击者的名字而忘记在升级功能中更改它。

如果您愿意将值不是变量本身而是clicker的属性,则意味着:

clicker.value

然后我们可以更优雅地解决这个问题:

var Clicker = function(initialValue){ // We create a Clicker constructor object
     this.value = initialValue
     this.upgrade = function(newValue){
         this.value = newValue;
     }
}

// Then we create an instance of the Clicker constructor, passing it an initial value of 3.
// Notice the difference in the constructor and the instance names (capital letter).
var clicker = new Clicker(3);

clicker.value; // It has an initial value of 3
clicker.upgrade(5);
clicker.value; // It's new value is now 5

当然,您可以使用new关键字创建更多Clicker对象的实例(非常重要,不要忘记它)或使用文字对象符号创建单例如果您不这样做需要多个实例:

var clicker = {
  value: 3,
  upgrade: function(newValue){
    this.value = newValue;
  }
}
clicker.value; // 3
clicker.upgrade(5);
clicker.value; // 5

答案 1 :(得分:0)

尝试使用构造函数+原型。不要扩展内置。

非常基本的例子:

 (function(){
    var Foo = function(arg){
  };
  Foo.prototype.upgrade = function(value, text, content){
    do something;
  };
  var baz = new Foo();
  var foobar = new Foo();
  baz.upgrade(a, b c);
  foobar.upgrade(d, e, f);
})();