Javascript 构造函数 : Accessing outside variable

标签 javascript variables constructor scope

我尝试访问一个全局对象;这是一种预设。

var perks = {health: 100, attack: 10};

var player = function(hp) {
   this.stats = perks;

   //Changing some standard values..
   this.stats["health"] = hp; 
}

var Peter = new player(200);
var Steven = new player(300);

希望你明白我的意思;问题是,它不能正常工作,我什至不确定它做错了什么。如果我创建了多个玩家,例如史蒂文、科林和詹姆斯,每个球员都有相同的特权。在这个例子中,彼得和史蒂文都有 300 点生命值。

如果我换行

this.stats = perks;

this.stats = {health: 100, attack: 10};

一切正常。彼得和史蒂文都有自己的统计数据。 如何访问全局 var perks

最佳答案

发生这种情况是因为在 JavaScript 中对象不会以这种方式复制,这就是为什么所有玩家都使用相同的 perks 对象。 有几种方法可以解决:

  1. 使用函数(对象自己的构造函数)创建新对象。

    function createPerks() {
        return {
            health: 100,
            attack: 10
        };
    }
    
    var player = function(hp) {
        this.stats = createPerks();
    
        //Changing some standard values..
        this.stats["health"] = hp; 
    }
    
    var Peter = new player(200);
    var Steven = new player(300);
    
  2. 每次创建新对象并使用常量作为默认值:

    var BASE_HEALTH = 100;
    var BASE_ATTACK = 10;
    
    var player = function(hp) {
        this.stats = {
            health: BASE_HEALTH,
            attack: BASE_ATTACK
        };
    
        //Changing some standard values..
        this.stats["health"] = hp; 
    }
    
    var Peter = new player(200);
    var Steven = new player(300);
    
  3. 使用 Object.create(适用于 IE9+,但适用于旧版浏览器):

    var perks = {health: 100, attack: 10};
    
    var player = function(hp) {
        this.stats = Object.create(perks);
    
        //Changing some standard values..
        this.stats["health"] = hp; 
    }
    
    var Peter = new player(200);
    var Steven = new player(300);
    

    请记住,Object.create 不会克隆一个对象,而是从一个对象继承另一个对象。

    Object.create 适用于旧浏览器的填充程序 Douglas Crockford :

    if (typeof Object.create !== 'function') {
        Object.create = function (o) {
            function F() {}
            F.prototype = o;
            return new F();
        };
    }
    

关于Javascript 构造函数 : Accessing outside variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30052543/

相关文章:

javascript - ngif 中的 Angular 自定义指令 - 设置其绝对儿子的宽度

javascript - 如果 QuestionID 相同,如何更新 setState 中的对象,否则添加到 setState

jquery - 将 var 传递给外部 jQuery

constructor - Typemock隔离器: Mock a dependency that's not injected?

c++ - 如何在子类中初始化静态常量成员变量?

haskell - Haskell 中的矩阵构造函数和方法

javascript - 如何删除自动生成id的父节点?如何指定那个id?

javascript - 谷歌地图的插值方法

javascript - 命名函数(而不是匿名)和创建对它的引用有什么区别?

c++ - 为什么变量初始化为0?