2011-12-21 77 views
3

我是javascript新手。據我所知,有5種方法可以創建一個對象(真的是我猜的結構)。我想知道最好的方法是什麼。謝謝。在javascript中創建對象/結構的最佳方式

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"); 

這就是顯示在螢火蟲DOM標籤:

enter image description here

回答

2

關於JavaScript最佳實踐的書籍的全部章節都已經寫入了這個主題。這就是說:如果你不關心繼承,並且不打算用方法創建對象的許多拷貝,,你只是創建一個「結構」,然後對象文字符號,你的第一個例子,是要走的路。在這種方法中,您使用的是對象字面符號,它是輕量且快速的。它不會與對象原型混淆或需要使用new運算符。

然而,開始將方法添加到您的對象,答案更改爲「它取決於」。

順便說一句,你離開了幾種方法來創建一個對象:

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

和,不建議:

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

採取這種從郵政約翰Resig的製作關於JavaScript 「類」 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

+1

那'makeClass'功能似乎是有用的。 +1 – 2011-12-21 16:10:14

4

我會用#3去。

  • #1不允許使用原型。
  • #2是匿名的,匿名函數並沒有幫助調試,因爲如果它沒有看到哪個函數導致問題(函數存儲的變量名不是函數的一部分,而函數的名稱是)。
  • #4令人困惑 - 訪問一個函數的兩種可能性。
+1

'var makeOption2 = function(name,dataType)'與'function makeOption2(name,dataType){'相同。所以,2和3是完全一樣的,都不使用「匿名」功能。 – 2011-12-21 15:58:14

+2

@火箭:不完全。該聲明將名爲'makeOption2'的函數(例如保存爲'.name')綁定到調試時顯示的函數中。第一個是匿名的,'makeOption2'不是該函數的一部分。第一個是匿名的,因爲它沒有* name *。儘管如此,您可以將匿名函數保存在變量中,但這是不同的。 – pimvdb 2011-12-21 15:59:22

+0

也沒有確切的問題導致'makeOption3'沒有自己的原型,而是必須成爲'Object'原型的一部分? – jondavidjohn 2011-12-21 16:01:49

2

第一個從設計的角度來看更可取 - 基於你的名字。

makeOption意味着它創建並重新調用一個對象。

您的所有其他解決方案都不會實際返回對象並需要「新」呼叫。顧名思義,它們在用作純數據結構時可能具有相似/相同的技術結果,但只有第一個用作「對象製造者」。

如果你想使用#2/3(#4沒有意義 - 你爲什麼要克隆該功能兩次),那麼你需要命名它 - optionPrototype可能是。

+1

由'new'創建的實例實際上也是對象。 – pimvdb 2011-12-21 16:02:19

+0

@pimvdb - 但爲了有一個實例,你需要新的。用Java的說法,makeOption是一個工廠並返回一個對象,而#2/3返回一個需要構造函數調用的「CLASS」(我對由於在Java中表達JS代碼的實際情況而引起的相關廢話表示歉意術語超出了我微不足道的Java技能) – DVK 2011-12-22 01:33:49

2

我個人使用makeoption3我已經嘗試過它們,發現makeoption3是最乾淨和最簡單的,如果您正在編寫多個對象。與其他文件相比,它的代碼更少,可以減小文件大小。

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

爲什麼你不想使用對象文字?看起來你真的在問關於對象和繼承..?

2

如果您不需要繼承功能,只需使用#1(因爲您基本上只是使用它來構建和返回對象文本)。否則,我會去#3,因爲它允許原型方法,並且也是一個命名函數而不是匿名函數。