我正在学习的这本书说下面的代码正在创建一个对象,但我不确定它是如何工作的。第二部分代码是我从在线教程中学到的另一种方式。但有什么区别? 我本人试图对此进行研究,但对所有这些以及我不理解的一些解释都是新手。使用每一个都有优点/缺点吗?提前谢谢。
function Player (name , score , rank)
{
this.name = name ;
this.score = score ;
this.rank = rank ;
}
var playerOne = new Player ( "Craig" , 199 , "1st" ) ;
以下是我以前做过的方式;
var playerOne = {name: "Craig" , score: 199 , rank: "1st"} ;
var playerTwo = {name: "Tohny" , score: 155522 , rank: "2nd"} ;
答案 0 :(得分:4)
主要区别在于第一个在其“原型链”中会有一个额外的对象。原型链是您在JavaScript中继承的方式。
因此,您可以扩展该对象,并且从Player
构造函数创建的所有对象都将继承这些项。
function Player (name , score , rank)
{
this.name = name ;
this.score = score ;
this.rank = rank ;
}
Player.prototype.getNameRank = function() {
return this.name + ":" + this.rank;
};
var playerOne = new Player ( "Craig" , 199 , "1st" ) ;
所以现在playerOne
对象将继承getNameRank()
方法,而使用对象文字语法创建的其他对象将不受影响。
var nr = playerOne.getNameRank();
console.log(nr); // Craig:1st
您在JavaScript中创建的所有(最常见的)对象将继承自Object.prototype
对象。第二个示例中的对象文字语法具有该对象,并且只有该对象位于原型链中。
构造函数中的对象首先包含Player.prototype
,然后是Object.prototype
。
答案 1 :(得分:0)
第一个代码示例是构造函数。根据我的理解,这是一种更强类型的创建对象的方式,因为已经定义了该对象的参数和成员。
第二个代码示例做做同样的事情,但没有什么定义对象实际应该包含什么或它应该如何表现。这并不是一件坏事,但对于某些情况来说,它远没有那么好,也没有像构造函数那样给你多功能性。
答案 2 :(得分:0)
但有什么区别?
第一个使用构造函数,第二个使用对象初始值设定项。
使用每一个都有优点/缺点吗?
是:
Player.prototype
上,则通过new Player
创建的对象可以访问这些属性,因为这些对象由创建时分配给它们的原型备份。您无法使用对象初始值设定项执行此操作。 (如果将对象初始值设定项与ECMAScript5的Object.create
组合,则可以执行此操作。)答案 3 :(得分:0)
您可以通过两种方式在JavaScript中创建对象。
但实际上,第二种方法只是以下的替代语法:
var playerOne = new Object();
playerOne.name = "Craig";
playerOne.score = 199;
playerOne.rank = "1st";
// ...