在没有“this”的情况下访问javascript中的对象中的变量

时间:2010-11-23 17:20:07

标签: javascript variables object this

  <HTML>
    <HEAD>
      <SCRIPT LANGUAGE="JavaScript">
        function Peon(number) {
            this.number = number;

            this.inc = function() {
                number=number+1;
            };

            return true;
        }
        var p=new Peon(10);

        function returnNumber() {
            p.inc();
            alert(p.number);
        }
      </SCRIPT>
    </HEAD>
    <BODY>

      <INPUT id="b00" TYPE="button" Value="Click" onClick="returnNumber()">

    </BODY>
  </HTML>

此代码无法正常工作。有没有办法让它工作而不必写

this.number=this.number+1;

这是一个微不足道的选择,但是在更大的代码中没有这个。*会使它更具可读性。有可能吗?

5 个答案:

答案 0 :(得分:2)

您可以将number设为“私有”,但是您需要 getter

    function Peon(number) {
        var number = number;

        // increment
        this.inc = function() {
            number++;
        };

        // a simple getter
        this.getNumber = function() {
            return number;
        }
    }
    var p = new Peon(10);
    p.inc();
    alert(p.getNumber());

你应该阅读Douglas Crockfords的“The Good Parts”,了解如何使用这种模式的更多信息,Google Books提供(有限的)预览。

此外,您不需要从构造函数返回任何内容,return true是多余的。

答案 1 :(得分:1)

不,您必须使用this来引用this对象上的属性。请注意,JavaScript中的this与其他一些语言(如C或Java)中的this非常不同。更多herehere

您的代码正在执行的是访问传递给number构造函数的Peon参数,而不是您在构造函数中创建的this.number属性。这就是为什么它不能按预期工作,但也不会失败。

没有理由在 inc构造函数BTW中定义Peon操作,并且没有理由(通过{{1}创建的每个单独对象)将获得该函数的自己的副本。相反,你可以这样定义它:

Peon

答案 2 :(得分:0)

不是,但这更简洁

this.number++

实际上,作为旁注,你最好在Peon的构造函数之外声明.inc。你可以用原型做到这一点。这样,每次创建Peon类型的对象时都不会重建inc函数。

Peon.prototype.inc = function(){
    this.number++;
}

或者您可以p.inc()使用p.number++而不是{{1}}。这是我能想到避免使用此关键字的唯一方法。

答案 3 :(得分:0)

我能看到的唯一可读方式是:

this.inc = function() {
   this.number++;
};

否则,在你的“更大代码”假设中,你可以这样做:

this.inc = function() {
   var number = this.number; // obviously simple here.  Imagine more complexity
   number++;
};

答案 4 :(得分:0)

是的,你不需要在javascript中使用'this'。您可以通过闭包而不是'this'

来访问变量

function createPeon(number) {

  function inc() {
      number=number+1;
  };
  function getNumber() {
      return number;
  }

  return { inc, getNumber };
}
var p=createPeon(10);
p.inc();
alert(p.getNumber());