在 js 中 不管是函數, 仍是方法, 仍是事件, 仍是構造器, ... 其本質都是函數. 只是處在不一樣的位子而已.javascript
四種:css
特徵: 就是一個簡單的函數調用. 函數名的前面沒有任何引導內容.java
function foo () {} var func = function () {}; ... foo(); func(); (function (){})();
this 的含義: 在 函數中 this 表示全局對象, 在瀏覽器中是 window數組
特徵: 方法必定是依附於一個對象, 將函數賦值給對象的一個屬性, 那麼就成爲了方法.瀏覽器
function f() { this.method = function () {}; } var o = { method: function () {} }
this 的含義: 這個依附的對象.app
建立對象的時候 構造函數作了什麼?函數
因爲構造函數只是給 this 添加成員. 沒有作其餘事情. 而方法也能夠完成這個操做, 就 this 而言,
構造函數與方法沒有本質區別.ui
特徵:this
補充:spa
工廠方法
// 工廠就是用來生產的, 所以若是函數建立對象並返回, 就稱該函數爲工廠函數 function createPerson( name, age, gender ) { var o = {}; o.name = name; o.age = age; o.gender = gender; return o; } // document.createElement()
寄生式建立對象
// 外表看起來就是構造方法, 可是本質不是的構造方法建立對象的方式 function createPerson( name, age, gender ) { var o = {}; o.name = name; o.age = age; o.gender = gender; return o; } var p = new createPerson( 'jim', 19, 'male' );
混合式建立
上下文 就是環境, 就是自定義設置 this 的含義
語法:
描述:
注意:
不管是 call 仍是 apply 在沒有後面的參數的狀況下( 函數無參數, 方法無參數 ) 是徹底同樣的.
function foo() { console.log( this ); } foo.apply( obj ); foo.call( obj );
第一個參數的使用也是有規則的
若是不傳入參數, 或傳入 null. undefiend 等, 那麼至關於 this 默認爲 window
foo(); foo.apply(); foo.apply( null ); foo.call( undefined );
在使用 上下文調用的 時候, 原函數(方法)可能會帶有參數, 那麼這個參數在上下文調用中使用 第二個( 第 n 個 )參數來表示
function foo( num ) { console.log( num ); } foo.apply( null, [ 123 ] ); // 等價於 foo( 123 );
上下文調用只是能修改 this, 可是使用的最多的地方上是借用函數調用.
傳統的作法
var a = {}; a[ 0 ] = 'a'; a[ 1 ] = 'b'; a.length = 2; // 數組自帶的方法 concat // 語法: arr.concat( 1, 2, 3, [ 4, [ 5 ] ] ); // 特色不修改原數組 var arr = []; var newArr = arr.concat( a );
因爲 a 是僞數組, 只是長得像數組. 因此這裏不行, 可是 apply 方法有一個特性, 能夠將數組或僞數組做爲參數
foo.apply( obj, 僞數組 ); // IE8 不支持
將 a 做爲 apply 的第二個參數
var newArr = Array.prototype.concat.apply( [], a )
處理數組轉換, 實際上就是將元素一個一個的取出來構成一個新數組, 凡是涉及到該操做的方法理論上均可以
push 方法
用法: arr.push( 1 ); 將這個元素加到數組中, 並返回所加元素的個數 arr.push( 1, 2, 3 ); 將這三個元素依次加到數組中, 返回所加個數 var a = { length: 0 }; // 僞數組 a[ a.length++ ] = 'abc'; // a[ 0 ] = 'abc'; a.length++; a[ a.length++ ] = 'def'; // 使用一個空數組, 將元素一個個放到數組中便可 var arr = []; arr.push( a ); // 此時不會將元素展開, 而是將這個僞數組做爲一個元素加到數組中 // 再次利用 apply 能夠展開僞數組的特徵 arr.push.apply( arr, a ); // 利用 apply 能夠展開僞數組的特性, 這裏就至關於 arr.push( a[0], a[1] )
slice
語法: arr.slice( index, endIndex ) 若是第二個參數不傳, 那麼就是 從 index 一致獲取到結尾 該方法不會修改原數組 var a = { length: 0 }; a[ a.length++ ] = 'abc'; a[ a.length++ ] = 'def'; // 假設他是一個數組, 就是應該 從 0 項開始截取到 最後 // 若是能夠的話, 應該 a.slice( 0 ) // 可是他沒有該方法 // 借用 數組的 slice, 將 this 轉換成 這個僞數組 var arr = []; var newArr = arr.slice.apply( a, [ 0 ] );