// 函數 //編程,就是將需求分解變成一組函數與數據結構的技能 //javascript是一門基於原型繼承的語言; //javascript 是一門函數式的面向對象編程語言,全部函數開源擁有方法 // 函數對象 /*** 1.對象字面量產生的對象鏈接到Object.prototype 2.函數對象鏈接到Function.prototype 3.每一個函數建立時都會兩個隱藏屬性:函數的上下文和實現函數行爲的代碼 4.函數對象在建立時會配有一個prototype屬性,它的值是一個擁有constructor屬性且值爲該函數的對象***/
// 函數字面量 var add = function(a,b){ //匿名函數 return a+b; } // 調用 /*4種調用模式: 方法模式調用、函數調用模式、構造器調用模式、apply調用模式 (這些模式在如何初始化關鍵參數this上存在差別) */ //1.方法調用模式: var myproject = { value:0, increamt:function(ico){ if(ico === 'number') this.value += 1; else this.value += ico; } //this從對象中取值或修改,this可取得所屬對象的上下文的方法 //稱爲公共方法 } myproject.increamt(3); console.log(myproject.value); //2.函數調用模式: //函數不是對象的屬性時,就被看成一個函數來調用,以此模式調用函數時,this被綁定到全局對象 //解決方法:that myproject.double = function(){ var that = this; //解決了全局對象的問題 var helper = function(){ that.value = add(that.value,that.value); }; helper();//函數形式調用helper }; myproject.double(); document.write(myproject.value);//6 //3.構造器調用模式(不推薦): //若是函數前面帶上 new 來調用,那麼會建立一個鏈接到該函數的prototype成員新對象,同時this會被綁定到那個新對象上。 var Quo = function (string){ this.status = string; } Quo.prototype.get_status = function (){ return this.status; } //構造一個 Quo事例 var myQuo = new Quo('confused'); console.log(myQuo.get_status()); //4.apply調用模式 //apply方法讓咱們構建一個參數數組傳遞給調用函數,容許咱們選擇this的值,apply(要綁定給this的值,一個參數數組); //構造一個包含兩個數字的數組,並將它們相加 var array = [3,5]; var sum = add.apply(null,array);//sum=8 //構造一個包含 status 成員對象 var statusObject = { status:'a-ok' }; //statusObject並無繼承自Quo.prototype,但咱們能夠在statusObject上調用get_status 方法 var status = Quo.prototype.get_status.apply(statusObject);//a-ok