哪种方式最适合在JavaScript中创建对象?在对象属性之前是否需要`var`?

Jam*_*mna 172 javascript object

到目前为止,我看到了三种在JavaScript中创建对象的方法.哪种方式最适合创建对象?为什么?

我还看到,在所有这些示例中,关键字var都没有在属性之前使用 - 为什么?是否没有必要var在属性名称之前声明,因为它提到属性是变量?

在第二种和第三种方式中,对象的名称是大写的,而在第一种方式中,对象的名称是小写的.我们应该将什么情况用于对象名称?

第一种方式:

function person(fname, lname, age, eyecolor){
  this.firstname = fname;
  this.lastname = lname;
  this.age = age;
  this.eyecolor = eyecolor;
}

myFather = new person("John", "Doe", 50, "blue");
document.write(myFather.firstname + " is " + myFather.age + " years old.");
Run Code Online (Sandbox Code Playgroud)

第二种方式:

var Robot = {
  metal: "Titanium",
  killAllHumans: function(){
    alert("Exterminate!");
  }
};

Robot.killAllHumans();
Run Code Online (Sandbox Code Playgroud)

第三种方式 - 使用数组语法的JavaScript对象:

var NewObject = {};

NewObject['property1'] = value;
NewObject['property2'] = value;
NewObject['method'] = function(){ /* function code here */ }
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 176

没有最好的方法,这取决于你的用例.

  • 如果要创建多个类似对象,请使用方法1.在您的示例中,Person(您应该以大写字母开头的名称)称为构造函数.这类似于其他OO语言中的.
  • 如果您只需要一种对象(如单身),请使用方式2.如果您希望此对象从另一个继承,那么您必须使用构造函数.
  • 如果要根据对象的其他属性初始化对象的属性,或者如果您具有动态属性名称,请使用方法3.

更新:作为第三种方式的请求示例.

依赖属性:

以下为不工作this没有参考book.无法使用对象文字中的其他属性值初始化属性:

var book = {
    price: somePrice * discount,
    pages: 500,
    pricePerPage: this.price / this.pages
};
Run Code Online (Sandbox Code Playgroud)

相反,你可以这样做:

var book = {
    price: somePrice * discount,
    pages: 500
};
book.pricePerPage = book.price / book.pages;
// or book['pricePerPage'] = book.price / book.pages;
Run Code Online (Sandbox Code Playgroud)

动态属性名称:

如果属性名称存储在某个变量中或通过某个表达式创建,则必须使用括号表示法:

var name = 'propertyName';

// the property will be `name`, not `propertyName`
var obj = {
    name: 42
}; 

// same here
obj.name = 42;

// this works, it will set `propertyName`
obj[name] = 42;
Run Code Online (Sandbox Code Playgroud)


Ana*_*ngh 110

定义函数有多种方法.它完全基于您的要求.以下是几种款式: -

  1. 对象构造函数
  2. 文字构造函数
  3. 基于功能
  4. 基于原型
  5. 基于功能和原型
  6. 基于单身人士

例子:

  1. 对象构造函数
var person = new Object();

person.name = "Anand",
person.getName = function(){
  return this.name ; 
};
Run Code Online (Sandbox Code Playgroud)
  1. 文字构造函数
var person = { 
  name : "Anand",
  getName : function (){
   return this.name
  } 
} 
Run Code Online (Sandbox Code Playgroud)
  1. function构造函数
function Person(name){
  this.name = name
  this.getName = function(){
    return this.name
  } 
} 
Run Code Online (Sandbox Code Playgroud)
  1. 原型
function Person(){};

Person.prototype.name = "Anand";
Run Code Online (Sandbox Code Playgroud)
  1. 功能/原型组合
function Person(name){
  this.name = name;
} 
Person.prototype.getName = function(){
  return this.name
} 
Run Code Online (Sandbox Code Playgroud)
  1. 独生子
var person = new function(){
  this.name = "Anand"
} 
Run Code Online (Sandbox Code Playgroud)

如果您有任何困惑,可以在控制台上试试.

  • 它会增加解释每种方式的利弊的价值。 (2认同)

jim*_*mbo 10

创建对象没有"最佳方法".每种方式都有好处,具体取决于您的用例.

构造函数模式(与new调用它的运算符配对的函数)提供了使用原型继承的可能性,而其他方式则没有.因此,如果您想要原型继承,那么构造函数是一个很好的方法.

但是,如果你想要原型继承,你也可以使用Object.create,这使得继承更加明显.

var obj = {foo: "bar"};如果您碰巧拥有希望在创建时手头设置的所有属性,则创建对象文字(例如)非常有用.

对于以后设置属性,如果您知道属性名称,NewObject.property1则通常优先使用语法NewObject['property1'].但是当你事先没有提供属性的名字时,后者很有用(例如:)NewObject[someStringVar].

希望这可以帮助!


Daa*_*mer 6

我想这取决于你想要什么.对于简单的对象,我想你可以使用第二种方法.当你的对象变大并且你打算使用类似的对象时,我猜第一种方法会更好.这样你也可以使用原型来扩展它.

例:

function Circle(radius) {
    this.radius = radius;
}
Circle.prototype.getCircumference = function() {
    return Math.PI * 2 * this.radius;
};
Circle.prototype.getArea = function() {
    return Math.PI * this.radius * this.radius;
}
Run Code Online (Sandbox Code Playgroud)

我不是第三种方法的忠实粉丝,但它对于动态编辑属性非常有用var foo='bar'; var bar = someObject[foo];.