【问题标题】:Is this a valid way to assign properties to an object?这是将属性分配给对象的有效方法吗?
【发布时间】:2013-05-11 13:33:37
【问题描述】:

这是为对象分配属性的有效方法吗?我有一个 if/else 语句,我希望它确定 pi 的属性是什么。

function game(){
    var self = this;

    this.determineDifficulty = function(){
        var difSet = document.getElementById("dif");
        var chosen = difSet.options[difSet.selectedIndex].value;

        if(chosen === "Easy"){
            var d = 0;
            self.p = 1;
            self.i = 1000;
        }else if(chosen === "Medium"){
            var d = 1;
            self.p = 0.1;
            self.i = 100;
        }else{
            var d = 2;
            self.p = 0.01;
            self.i = 10;
        }
        return d;
    }
}

var myGame = new game();

如果我提醒myGame.p,它会给我正确的值。但这是好的做法吗?据我了解,如果我想要一个可以在多种方法中使用的变量 - 我应该将其分配为对象的属性。另一种选择是返回 this 是一个常规变量。如果这正确吗?

【问题讨论】:

  • 这取决于 - 您分配给 this(或 self,在您的示例中)的任何内容都可以公开访问,就像您在 myGame.p 中显示的一样。您可以在 game 函数内声明“私有”变量 - 这意味着函数内的任何内容都可以访问/更改它们,但您不能离开 game

标签: javascript oop properties this self


【解决方案1】:

您可以使用determineDifficulty 内部的this 引用来进行对象属性分配,而不是使用复制变量。请注意,这是有效的,因为您将 determineDifficulty 作为游戏的对象属性。如果您在 'game()' 中将其声明为内联函数,则 this 将引用内联函数,而不是游戏。

请注意,最好将所有构造函数大写。所以应该是function Game() 而不是function game()

编辑:

您可以按照我所说的将属性值直接分配给对象。但是,如果您将determineDifficulty 设置为回调函数,那么this 将不会引用您需要的对象。

//For Example:

function Obj() {
    this.foo = 5;
    this.set_foo = function() {this.foo = 10; }
}

var obj = new Obj();
alert(this.foo); //5
obj.set_foo();
alert(this.foo); //10

//The Following will not work
element.onclick = obj.set_foo;

当点击元素时,this 将引用该元素而不是obj

【讨论】:

  • this 指的是我的内联函数,所以我需要将determineDifficulty设为属性吗?但它是一种方法,而不是一种属性?我在这里有点困惑。
  • this.determineDifficulty = function() ... 为您的游戏对象提供了一个名为 determineDifficulty 的属性,其值是= 右侧的函数。在myGame.determineDifficulty()this的函数体执行过程中会引用myGame。
猜你喜欢
  • 1970-01-01
  • 2013-02-02
  • 2014-04-05
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多