首页 > 解决方案 > 在 JavaScript 对象中正确使用“this”

问题描述

在下面的示例中,我如何访问enums.ROCK道具内部?按照目前的情况,我得到一个错误Uncaught TypeError: Cannot read property 'enums' of undefined。请检查评论ERROR LINE

const app = {
  enums: {
    ROCK: 'ROCK',
    PAPER: 'PAPER',
    SCISSORS: 'SCISSORS',
    DEFAULT_USER_CHOICE: this.ROCK //default, take note of this keyword
  },
  prop: {
    isGameRunning: false,
    mySelection: this.app.enums.ROCK //ERROR LINE
  }
};

我也试过了mySelection: app.enums.ROCK,在这种情况下我得到了Uncaught ReferenceError: Cannot access 'app' before initialization

示例 1: https ://jsfiddle.net/5zp7yode/

示例 2: https ://jsfiddle.net/5zp7yode/1/

以下工作没有任何问题:

var person = {
  firstName: "John",
  lastName : "Doe",
  id       : 5566,
  fullName : function() {
    return this.firstName + " " + this.lastName;
  }
};

alert(person.fullName());

示例 3: https ://jsfiddle.net/0o93afLq/

我也尝试过以下但仍然无法访问道具内的枚举:

const app = {
  self: this,
  enums: {
    ROCK: 'ROCK',
    PAPER: 'PAPER',
    SCISSORS: 'SCISSORS',
    DEFAULT_USER_CHOICE: this.ROCK //default, take note of this keyword
  },
  prop: {
    isGameRunning: false,
    mySelection: self.enums.ROCK
  }
};

alert(app.prop.mySelection);

示例 4: https ://jsfiddle.net/x89kj2zn/

另一个使用函数,但我不能在里面调用函数prop

const app = {
  enums: {
    ROCK: 'ROCK',
    PAPER: 'PAPER',
    SCISSORS: 'SCISSORS',
    DEFAULT_USER_CHOICE: this.ROCK //default, take note of this keyword
  },
  prop: {
    isGameRunning: false
  },
  getMySelection: function(){
    return app.enums.ROCK;
  }
};
alert(app.getMySelection());

示例 5: https ://jsfiddle.net/v5qzdx3s/

标签: javascript

解决方案


你可以利用get.

const app = {
  enums: {
    ROCK: 'ROCK',
    PAPER: 'PAPER',
    SCISSORS: 'SCISSORS',
    get DEFAULT_USER_CHOICE(){
      return app.enums.ROCK
    }
  },
  prop: {
    isGameRunning: false,
    get mySelection(){
      return app.enums.ROCK
    }
  }
};

console.log(app)


推荐阅读