2015-11-14 31 views
2

如果我檢查對象對象的類型,它說「功能」:JavaScript:如果「對象」是一個函數,它如何具有方法?

typeof Object === "function" 

但我們都知道,對象有多種方法,如:

Object.create(); 
Object.freeze(); 
Object.seal(); 
Object.getPrototypeOf(); 
... 

(檢查https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object

我的問題:這怎麼可能?一個函數如何能夠有方法?我一直認爲,方法是一個函數,它是對象屬性的值。

在這裏,我們把它作爲一個對象:

Object.freeze(); 

在這裏,我們把它作爲一個構造函數:

var myObj = new Object(); 
var myObj2 = Object(); 

什麼是 「對象」 呢?看起來它既是:功能和對象。

它是一種特殊情況,因爲這些(Object,Array,String,Number)是「本地構造函數」?

回答

2

一個函數是一個數字是一個字符串是一個布爾值是一個數組是一個對象。

好吧,那不是那麼簡單。但是,一個函數是一個對象,可以有屬性,就像在JavaScript中所有其他對象:

var a = function() { return 10; }; 
a.foo = function() { return 20; }; 
console.log(a());  // 10 
console.log(a.foo()); // 20 
4

一個Function是在Javascript對象,因此既可以這樣調用的函數,可以有屬性(例如使用的方法) 。該功能也都有內置的屬性和方法

function f() { 
    console.log("hello"); 
} 

f.greeting = "goodbye"; 

f();      // outputs "hello" 
console.log(f.greeting); // outputs "goodbye" 

注如.call().apply().length.prototype等...查看Function object on MDN的描述爲在建的屬性/方法的詳細信息。

Object本身就是一個,就是像這樣使用一個構造函數:

var x = new Object(); 

雖然一般人會使用對象文字語法來聲明一個新的對象:

var x = {}; 

作爲構造函數Object都可以作爲構造函數調用(使用new),並且它可以具有其自己的屬性/方法。

我的問題:這怎麼可能?一個函數如何能夠有 方法?我一直認爲,一種方法是一個函數,它是對象屬性的值。

這就是Javascript的設計原理。函數是對象,可以擁有自己的屬性/方法。

它是一種特殊情況,因爲這些(Object,Array,String,Number)是 「本地構造函數」?

這不是特例。所有功能都是如此。正如我上面的代碼示例所示,您可以定義自己的函數併爲它們提供屬性/方法。

+0

好吧,我明白了!感謝您的回答。但爲什麼例如「join」在函數本身和原型樹(Array.join vs Array.prototype.join)中定義? – Teemoh

+1

@souser - 原型上的東西是對象的**實例**的方法。構造函數中的東西是不帶實例的靜態方法。所以,'Array.isArray()'是一個靜態方法,但'Array.prototype.concat()'是一個數組實例的方法。你瞭解靜態方法和實例方法的區別嗎? – jfriend00

+0

更確切地說,如果將事物分配給原型,它不在該類型的「實例」上,但是當JavaScript正在尋找該方法時,它會沿原型鏈上升,直到它找到一個。 這意味着實例本身沒有被定義,除非你明確地做了「onstance.myFunction = sth;」 – svobol13

1

函數的一個實例與其他任何對象一樣 - 可以自由定義方法。

+0

好吧,我從來沒有想過要給一個函數添加一個屬性,但很高興知道這是可能的! – Teemoh

1

這怎麼可能?

在JavaScript中,函數是first class objects。因此,作爲一個函數對象可以有屬性以及方法。

var a = new Object()? 

什麼是 「對象」 呢?

這裏對象作爲Constructor function,它將創建一個新的對象。

1

對象是「構造函數」函數。它與var obj = {};不一樣。 Typeof Object是函數,typeof obj是對象。

在JavaScript中是一切「對象」,可以有「屬性」和「方法」。

試試這個例子:

function Class() { 
    if (this === window) { 
     return new Class(); 
    } 
}; 
// You create new 'type' Class (it's same with Object) 
// You can invoke it (in browser) as function like Class(); 
// Or as a constructor like new Class(); 
// Or treat is as object - you can add properties 
Class.getInstance = function() { return new Class(); }; // Here you add 'property' and its value is function 
typeof Class === typeof Object; // true 
Class.getInstance(); // You you function that calls your 'type' as 'constructor' (with new operator). 

你是絕對正確的。函數是Object的特例,所以函數是同時的。它的狗就像狗和動物一樣。

最後一點:在JavaScript中,一切對象和一些對象都是特殊的 - 它們可以通過「調用」/「調用」。這些是職能(他們是「一等公民」)。數組,數字...是「只是」本地構造函數。

相關問題