Javascript构造函数:访问外部变量

时间:2015-05-05 12:08:18

标签: 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

2 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为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不会克隆对象,而是从另一个对象继承一个对象。

    <Douglas Crockford

    为旧版浏览器

    Object.create填充内容

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

答案 1 :(得分:1)

您撰写this.stats = perks;时,它们都引用object {health: 100, attack: 10} var Steven = new player(300);。因此,对其中任何一个所做的任何更改都将始终影响另一个。

由于{health: 300, attack: 10}是您指定的最后一个值。你的所有玩家现在都有rowspan