在javascript中创建对象/结构的最佳方法

时间:2011-12-21 15:53:52

标签: javascript

我是javascript的新手。据我所知,有5种方法可以制作一个对象(我猜是一个结构)。我想知道最好的方法是什么。感谢。

var makeOption = function(name, dataType){
    var option = {
        name: name,
        dataType: dataType
    };
    return option;
};

var makeOption2 = function(name, dataType){ 
    this.name = name;
    this.dataType = dataType;
};

function makeOption3(name, dataType){
    this.name = name;
    this.dataType = dataType;
};

var makeOption4 = function makeOption4Name(name, dataType){
    this.name = name;
    this.dataType = dataType;
};

var v1A = makeOption("hannah", "int");
var v1B = new makeOption("hannah", "int");

//var v2A = makeOption2("hannah", "int"); <- undefined.  
var v2B = new makeOption2("hannah", "int");

// var v3A = makeOption3("hannah", "int"); <- undefined.
var v3B = new makeOption3("hannah", "int");

// var v4A = makeOption4("hannah" ,"int"); <- undefined.
var v4B = new makeOption4("hannah" ,"int");

这是firebug DOM选项卡中显示的内容:

enter image description here

7 个答案:

答案 0 :(得分:4)

我会选择#3。

  • #1不允许使用原型。
  • #2是匿名的,匿名函数在调试时没有帮助,因为你没有看到导致问题的函数是什么(函数存储的变量名不是函数的一部分,而函数的名称)是)。
  • #4令人困惑 - 访问一个功能的两种可能性。

答案 1 :(得分:2)

从John John Resig的帖子中得到关于javascript“Class”instatiation的内容,他指出......

// Very fast
function User(){}
User.prototype = { /* Lots of properties ... */ };

// Very slow
function User(){
  return { /* Lots of properties */ };
}

这就是我们所说的他发布了这段代码......

// makeClass - By John Resig (MIT Licensed)
function makeClass(){
  return function(args){
    if ( this instanceof arguments.callee ) {
      if ( typeof this.init == "function" )
        this.init.apply( this, args.callee ? args : arguments );
    } else
      return new arguments.callee( arguments );
  };
}

然后使用它,利用原型链的速度..

var User = makeClass();
User.prototype.init = function(first, last){
  this.name = first + " " + last;
};
var user = User("John", "Resig");
user.name
// => "John Resig" 

这也考虑了new的使用,它允许使用关键字,但不需要它。

<强> Link to Original Post

答案 2 :(得分:2)

从设计的角度来看,第一个是优选的 - 基于您的名字。

makeOption表示它会创建并重新调整对象。

所有其他解决方案实际上并不返回对象并需要“新”调用。当用作纯数据结构时,它们可能具有相似/相同的技术结果,但只有第一个用作“对象制造者”,顾名思义。

如果您想使用#2/3(#4没有意义 - 为什么要将该功能克隆两次),那么您需要将其命名为其他内容 - optionPrototype可能是。

答案 3 :(得分:2)

我个人使用makeoption3我已经尝试了所有这些并发现如果你正在编写多个对象,makeoption3是最干净和最简单的。此外,它的代码少于保持文件大小的其他代码。

    function makeOption3(name, dataType){
    this.name = name;
    this.dataType = dataType;
};

答案 4 :(得分:2)

如果您不需要继承功能,请使用#1(因为您基本上只是使用它来构建和返回对象文字)。否则我会选择#3,因为它允许原型方法,也是一个命名函数而不是匿名函数。

答案 5 :(得分:2)

关于JavaScript最佳实践的书籍全部内容都是针对这一主题撰写的。那就是说:如果你不关心继承并且不打算用方法创建大量的对象副本, ie ,你只是创建一个“struct”,然后是对象文字表示法,你的第一个例子,是要走的路。在该方法中,您使用的是对象文字符号,它是轻量级且快速的。它不会弄乱对象原型或需要使用new运算符。

然后,开始向对象添加方法,答案将更改为“它取决于”。

顺便说一句,你遗漏了几种创建对象的方法:

var o = {};
o.name = "hannah";
o.dataType = "int";

并且,不推荐:

var o = new Object();
o.name = "hannah";
o.dataType = "int";

答案 6 :(得分:0)

为什么不想使用对象文字?看起来你真的在问对象和继承..?