簡體   English   中英

我們怎樣才能證明javascript函數是對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM