函數屬性、方法和建構函式
一、函數屬性
函數是js中特殊的對象,可以擁有屬性。
funcation.length屬性:代表形參的長度,唯讀屬性,不允許更改
arguments.length代表的是實參長度
prototype屬性:每個函數都有一個prototype屬性,當把函數當做建構函式時,新建立的對象會從原型對象上繼承屬性。 二、函數方法
與其他語言不同,ECMAScript函數不介意傳遞進來多少個參數,也不在乎是什麼類型。因為實參在內部是用一個類數組來表示的,函數接收到的始終是個類數組。
具名引數(形參)只提供便利,但不是必須的。
注意:js中方法本身是沒有重載的,因為:
1.方法的本質就是一個Function類型的變數,如果出現同名的變數,會覆蓋。
2.但是依靠函數內部屬性argument來類比重載。
//類比函數重載。
function testArgument() {if (arguments.length == 1) { alert("哈哈~1"+arguments[0]); } else if (arguments.length == 2) { alert("哈哈~2" + arguments[0] + "," + arguments[1]); } else { alert("哈哈~3"); }}testArgument();testArgument(1);testArgument(1, 2);prototype 是儲存某個對象【所有執行個體】【共用屬性】的地方。就是說,比如toString()和valueOf()等方法實際上都儲存在prototype名下,只不過通過各自對象的執行個體訪問罷了。在建立自訂參考型別及實現繼承時,prototype屬性的作用是極為重要的。
call()和apply()方法:看作是某個對象的方法,通過調用方法的形式來間接調用函數。
第一個參數是要調用函數的母對象,即調用上下文。在函數體內通過this獲得對他的引用。
f.call(o);
f.apply(o);
等價於
o.m = f();
o.m();
delete o.m;
ES5中第一個實參都會變成this的值,哪怕傳入null和undefined。
ES3和非strict 模式中,傳入null和undefined會被全域對象替換,而其他原始值會被其他相應的封裝對象替代。
bind()方法:ES5中新增加方法,主要作用是將函數綁定至某個對象。
當函數f()上調用bind()方法傳入對象o時,這個方法將返回一個新的函數,調用新的函數時會當做o的方法進行調用。 三、函數建構函式
Function()建構函式
Function()建構函式可以傳入任意數量的字串實參,最後一個實參所表示的文本就是函數體。 Function()建構函式運行JavaScript在運行時動態建立並編譯函數 每次調用Function()建構函式都會解析函數體,並建立新的函數對象。若在迴圈中建立效率低下。 Function()所建立的函數並不使用詞法範圍,相反,函數體代碼的編譯總是會在頂層函數執行。 四、可調用對象
函數是可調用對象。所有的函數都是可調用的,但是並非所有的可調用對象都是函數。
可調用對象在兩個JavaScript實現中不能算作函數。window.alert()和document.getElelmentById()使用了可調用的宿主對象但是本質上不是function對象。
RegExp對象。判斷一個對象是否為函數和isArray類似。
[javascript] view plaincopyfunction isFunction(x){ return Object.prototype.toString.call(x) === "[object Function]"; }