2013-02-17 55 views
1

我瞭解到一個對象的方式可以在JavaScript(工廠函數)來創建如下:如何區分工廠對象和功能?

var newPerson=function(name){ 
    var result = new Object(); 
    result.name = name; 
    result.getName = function(){ 
     return this.name; 
    }; 
    return result; 
}; 


var personOne = newPerson("Diego"); 
var personTwo = newPerson("Gangelo"); 

console.log(personOne.getName()); // prints Diego 
console.log(personTwo.getName()); // prints Gangelo 

嗯,我發現的地方,如下函數可以創建:

var hello = new Function('alert("Hello, World!");'); 

所以我怎麼能知道一個函數的對象,如果他們是以相同的方式聲明?

回答

2

「我怎麼會知道,從函數的對象,如果他們以同樣的方式正在申報?」

嗯......因爲Function構造函數返回function對象,你可以簡單地使用typeof進行測試。

typeof hello === "function"; // true 

typeof personOne === "function"; // false 

「工廠功能」只爲你寫了一個函數返回一個新的對象看中的術語。這是使用對象構造函數創建對象的替代方法。

所以,如果我想創建新對象的功能,我可以用一個函數作爲一個構造函數,它要求我new調用它:

function MyObj() { 
    this.foo = "bar" 
} 

var o = new MyObj(); 

或者,我可以用這個「工廠「模式:

function MyObj() { 
    return { 
     foo: "bar" 
    } 
} 

var o2 = MyObj(); 

他們都創建一個新的對象,但第一種方式爲您提供了一個額外的PROT otype類對象,您可以擴展而不影響其他對象。

這兩種方法都不能構成函數對象。


JavaScript有內置的構造函數用於創建本機對象和原語。構造函數,如:

  • Function
  • Array
  • Object
  • RegExp

...等等。

這些內置於環境中,可用於創建新的本機數據。但JS也給你建立你自己的構造函數的能力。這就是我在上面的例子中所做的。

您自己的構造函數會返回一個Object,但是它又會鏈接到一個乾淨的prototype對象,該對象可以爲從該構造函數創建的所有對象進行擴展。

2

如果有幫助,行

var hello = new Function('alert("Hello, World!");'); 

是基本相同

var hello = function() { alert("Hello, World!"); }; 

...除了一些併發症各地結合。在實踐中,幾乎沒有任何理由使用new Function(...)

你可以告訴你處理什麼樣的對象,使用幾個選項:

  • typeof提供相當總值指示(在這種情況下,"object"對比"function")。

  • Object.prototype.toString.call(whatever)給你給你喜歡[object Object][object Function][object Array]字符串的詳細信息(在規範中定義的對象)。

更多在我的博客文章Say what?與搞清楚什麼東西是在JavaScript(爲什麼你很少真正需要)的交易。