[英]Difference between a JavaScript Function() and a JavaScript object
我試圖理解JavaScript中的一些讓我感到困惑的東西。
假設我想在JavaScript中創建一個方法Guard.ThrowError()
,我有兩種方法:
使用對象:
這基本上就是我在網上找到的方法。
var Guard2 = { ThrowIfNull: function() { throw new Error('sdmflsfk'); } };
使用功能:
當您在TypeScript中創建一個類“Guard”並讓它編譯為JavaScript時,您會得到如下內容:
var Guard = (function() { function Guard() { } Guard.ThrowIfNull = function () { throw new Error('sdmflsfk'); }; return Guard; })();
可以使用Guard.ThrowIfNull()
調用這兩個函數。 我想知道有什么區別,什么時候選擇我選擇方法1而不是方法2?
感謝您的寶貴意見。
親切的問候
我想知道有什么區別,什么時候選擇我選擇方法1而不是方法2?
唯一的區別是Guard
是第二個示例中的一個函數,而不是第一個函數。 所以可以調用第二個(在那個代碼中它實際上沒有做任何事情,但可以調用它); 第一個不能。
函數是JavaScript中的對象,正確的實際對象,因此與所有其他對象一樣,它們可以像ThrowIfNull
一樣添加其他屬性。
jQuery是一個廣泛使用的例子:主要功能, jQuery
(aka $
)用於其功能:
$("#foo").on("click", function() { /*...*/ });
...以及它的對象,因為它具有與Guard
完成的各種屬性:
$.ajax(/*...*/);
兩種方法都有效,因為javascript中的函數也是一個對象。 唯一的區別是你可以調用函數myFunction();
你不能用一個對象來做。
函數方法用於在JS中創建類。 使用此方法,您可以擁有私有和公共屬性。 這在對象方法中無法實現。 所有屬性都是公共的。
function testClass(){ // Private member var a = "abc"; var b = "test"; function print(){ console.log(a,b); } return { print: print } } testClass().print(); // testClass().a This will throw error
Guard2
- 您的方法1 - 在某種程度上是對象的“靜態”定義。 您無法實例化該類型的另一個對象。
Guard
- 你的方法2 - 是混合的:它是一個'自動類' Guard
的定義,它被實例化。 結果幾乎相同,因為您也無法從中實例化新對象。
通常,你會這樣做:
var Guard = function() {
function Guard() { };
Guard.ThrowIfNull = function () {
throw new Error('sdmflsfk');
};
};
var myGuard = new Guard();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.