JavaScript:使用不带对象对象的函数返回的对象

问题描述:

我是JavaScript/jQuery中的新成员。想知道是否有更好的方法通过函数返回对象。JavaScript:使用不带对象对象的函数返回的对象

//this is the Object creator. 
function makeNewPlayer(name, score) { 
    var player = {}; 
    player.name = name; 
    player.score = score; 

    return player; 
}; 

这是我如何使用该功能。

var player_info = makeNewPlayer('Bob' ,100); 

然而,当我使用的对象,我需要调用它像这样:

player_info.player.name 
player_info.player.score 

它看起来愚蠢的,任何方式直接使用对象也是这样吗?

player_info.name 
player_info.score 

编辑:

由于我不知道有多少对象将被函数创建。 让我们说有一个for循环,使score_1,score_2等

function makeNewPlayer(name, score) { 
    var player = {}; 
    player.name = name; 

    for(i=0, i<number_of_score, i++){ 
     eval("player.score_" + i) = score[i]; 
    }; 

    return player; 
}; 

使用new

我复制从my blog一些文字,正好解决您的疑惑:

构造函数用于创建对象的特殊功能:

例子:

function StarkIndustries(name, birth) { 
    this.name = name; 
    this.birth = birth; 
} 
var iron1 = new StarkIndustries('iron01', 2017); 
var iron2 = new StarkIndustries('iron02', 2017); 
alert(iron1.name); 
alert(iron2.name); 

结果:

iron01 
iron02 

通过一个函数之前加入新的功能变成一个 构造函数,构造一个对象。

但它是危险的调用设计作为构造 功能没有新的,因为它会修改全局对象window。因此构造函数中的完整性检查是必需的:

if (!(this instanceof StarkIndustries)) { 
    warn("StarkIndustries is a constructor and should be called with `new`"); 
} 

返回到您的代码,它应该是:

function makeNewPlayer(name, score) { 
    this.name = name 
    this.score = score 
}; 

var iron1 = new makeNewPlayer('iron01', 2017); 

function makeNewPlayer(name, score) { 
    return {name, score}; 
}; 

let players = []; 
// in for loop -- sample code only, you need to supply name & score 
{ 
    players.push(makeNewPlayer(name, score)); 
} 
+0

片断如果我不知道该函数将创建多少个对象? 假设有一个for循环让score_1,score_2等,我该如何处理? –

+0

在这种情况下,您所关心的是找到合适的收集对象。在大多数情况下,Array是一个不错的选择,例如,让我们将其命名为玩家。在for循环中,只需调用players.push(newPlayer)即可将新创建的播放器添加到该阵列中。 – tibetty

您可以使用自毁分配声明全局或局部范围的变量

//this is the Object creator. 
 
function makeNewPlayer(name, score) { 
 
    var player = {}; 
 
    player.name = name 
 
    player.score = score 
 

 
    return player; 
 
}; 
 

 
var player_info = makeNewPlayer("Bob", 100); 
 

 
{ 
 
    let {name: _name, score} = player_info; 
 
    // do stuff with `_name`, `score` 
 
    console.log(_name, score); 
 
}

除了“Bob”应该在引号中的事实,它对我来说工作得很好。

var player_info = makeNewPlayer('Bob', 100); 

,然后我能够访问它就好像这样:

player_info.name 
player_info.score 

您可以使用里面的函数的临时构造函数:

function makeNewPlayer(name, score){ 
    const Player = function(name, score){ 
    this.name = name; 
    this.score = score; 
    }; 

    return new Player(name, score); 
} 

您也可以使用外部函数而不是嵌套函数。

在不改变你的函数,我能够得到的输出的方式,你希望它

player_info.name 
player_info.score 

看看下面

//this is the Object creator. 
 
function makeNewPlayer(name, score) { 
 
    var player = {}; 
 
    player.name = name 
 
    player.score = score 
 

 
    return player; 
 
}; 
 

 
var player_info = makeNewPlayer("Bob", 100); 
 
console.log(player_info.name); 
 
console.log(player_info.score);