1

我正在学习的书说以下代码正在创建一个对象,但我不确定它是如何工作的。第二部分代码是我从在线教程中学到的另一种方式。但是有什么区别呢?我自己尝试对此进行研究,但对所有这些以及一些我不理解的解释都很陌生。使用每一个都有优点/缺点吗?提前致谢。

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"} ;
4

4 回答 4

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.

于 2013-10-29T17:51:13.687 回答
0

第一个代码示例是构造函数。据我了解,这是一种创建对象的更强类型的方式,因为该对象的参数和成员已经定义。

第二个代码示例同样的事情,但是没有定义对象应该实际包含什么或它应该如何表现。这并不是一件坏事,但在某些情况下,它的可取性要低得多,并且不会像构造函数那样为您提供多功能性。

于 2013-10-29T17:51:05.317 回答
0

但是有什么区别呢?

第一个使用构造函数,第二个使用对象初始化器

使用每一个都有优点/缺点吗?

是的:

  • 构造函数可以被重用并在其中包含逻辑,因此非常适合需要制作具有相同特征的多个对象时。当您在编写了一堆代码后需要修改这些特性时特别好,因为创建对象的代码很好而且包含。
  • 构造函数可以将原型分配给它们创建的对象。如果您将属性放在 上Player.prototype,则这些属性可由通过 创建的对象访问new Player,因为这些对象由创建时分配给它们的原型备份。你不能用对象初始化器来做到这一点。(如果你将对象初始化器与 ECMAScript5 结合起来,你可以Object.create做到这一点。)
  • 对象初始值设定项在使用时是显式且相当清晰的,因为您可以看到您正在创建的每个属性的名称,而由于构造函数的参数基于您提供它们的顺序,所以它可以更少在创建对象的地方清除(例如,使用构造函数)。事实上,有时您会看到构造函数接受一个对象作为其参数,然后使用该对象的属性来填充他们正在创建的对象。
于 2013-10-29T17:52:03.107 回答
0

您可以通过两种方式在 JavaScript 中创建对象。

  1. 函数构造函数(结合 new 关键字)
  2. 对象文字(您显示的第二种方式)。

但实际上,第二种方法只是以下的替代语法:

var playerOne = new Object();
playerOne.name = "Craig";
playerOne.score = 199;
playerOne.rank = "1st";
// ...
于 2013-10-29T17:52:45.067 回答