![](/img/trans.png)
[英]If functions are objects in JS, can we have methods inside functions? If so, how to call them?
[英]How can we prove that javascript functions are objects?
我在用
var foo = function(){}
typeof(foo)
- 返回函數而不是Object
而javascript概念告訴javascript中的所有函數都是對象?
首先,有該規范明確規定他們的對象,在很多地方,包括事實在這里它定義了術語“功能”:
功能
可以作為子例程調用的Object類型的成員
根據經驗,有很多方法可以證明它,但最簡單的方法之一是為其上的屬性賦值:
var foo = function() { }; foo.myProperty = "my value"; console.log(foo.myProperty); // "my value"
或者使用一個作為原型(這是不尋常的,但可能),這證明它只有對象可以是原型:
var foo = function() { }; var obj = Object.create(foo); console.log(Object.getPrototypeOf(obj) === foo); // true
這個測試怎么樣?
> x = function(){}
<- function (){}
> x.a = "Asd"
<- "Asd"
> x
<- function (){}
> x.a
<- "Asd"
對整數執行相同操作將導致未定義的賦值
> x = 1
<- 1
> x.a = 123
<- 123
> x
<- 1
> x.a
<- undefined
請參閱我的測試方法列表,以測試值是否屬於Object類型 。
它們將功能檢測為對象,例如
var func = function(){};
Object(func) === func; // true --> func is an object
如果您需要更正式的證明,則需要查看規范,例如ECMAScript Overview
函數是可調用對象
你可以非常簡單地證明這一點:
console.log(Object.getPrototypeOf(Function.prototype)); console.log(Object.prototype === Object.getPrototypeOf(Function.prototype)); // or, being evil Object.prototype.testFn = () => console.log('Exists on all objects'); ({}).testFn(); [].testFn(); (new Number(5)).testFn(); Math.sqrt.testFn();
前兩行表明, Function.prototype
之外的原型鏈中的下一步是Object.prototype
。
其他行顯示您可以向Object.prototype
添加屬性( 嚴重不要這樣做 )並且它存在於所有對象上。 在這種情況下,我們在空對象,空數組, Number
對象和Math.sqrt
函數上測試它。 通過向Object.prototype
添加屬性(在本例中為函數),所有其他屬性也獲得了屬性。
console.log(Function.prototype instanceof Object);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.