javascript中的对象语法

Object syntax in javascript

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
function Player (name , score , rank)
{
this.name = name ;
this.score = score ;
this.rank = rank ;
}
var playerOne = new Player ("Craig" , 199 ,"1st" ) ;

以下是我以前做过的方式;

1
2
var playerOne = {name:"Craig" , score: 199 , rank:"1st"} ;
var playerTwo = {name:"Tohny" , score: 155522 , rank:"2nd"} ;

主要区别在于第一个在其"原型链"中将有一个额外的对象。原型链是您在JavaScript中继承的方式。

因此,您可以扩展该对象,并且从Player构造函数创建的所有对象都将继承这些项。

1
2
3
4
5
6
7
8
9
10
11
12
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()方法,而使用对象文字语法创建的其他对象将不受影响。

1
2
3
var nr = playerOne.getNameRank();

console.log(nr); // Craig:1st

您在JavaScript中创建的所有(最常见的)对象都将继承自Object.prototype对象。第二个示例中的对象文字语法具有该对象,并且只有该对象位于原型链中。

构造函数中的对象首先具有Player.prototype,然后是Object.prototype


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

  • 函数构造函数(与new关键字一起使用)
  • 对象文字(你展示的第二种方式)。
  • 但实际上,第二种方法只是以下的替代语法:

    1
    2
    3
    4
    5
    var playerOne = new Object();
    playerOne.name ="Craig";
    playerOne.score = 199;
    playerOne.rank ="1st";
    // ...


    But what is the difference?

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

    Are there advantages/disadvantages to using each one?

    是:

    • 构造函数可以重用并且具有逻辑,因此当您需要创建具有相同特征的多个对象时,这些函数很有用。当你编写一堆代码后需要修改这些特性时,特别好,因为创建对象的代码很好并且包含在内。
    • 构造函数可以将原型分配给它们创建的对象。如果将属性放在Player.prototype上,则通过new Player创建的对象可以访问这些属性,因为这些对象由创建时分配给它们的原型备份。您无法使用对象初始值设定项执行此操作。 (如果将对象初始值设定项与ECMAScript5的Object.create组合,则可以执行此操作。)
    • 对象初始化器在使用时是显式且相当清晰的,因为您可以看到您正在创建的每个属性的名称,而由于构造函数的参数基于您提供它们的顺序,因此它可以更少在您创建对象的位置清除(例如,使用构造函数)。事实上,有时你会看到构造函数接受一个对象作为它们的参数,然后使用该对象的属性来填充它们正在创建的对象。

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

    第二个代码示例确实做了同样的事情,但没有定义对象实际应该包含什么或它应该如何表现的东西。这并不是一件坏事,但对于某些情况来说,它远没有那么好,也没有像构造函数那样给你多少的功能。