好吧,因為很重要的事情,幾天沒寫筆記了。關於對象:||可以用來填充預設值,如:myApp.name || "無"&&可以用來避免錯誤,myApp.NameObj有某種情況不存在,那麼可以用myApp.NameObj &&myApp.NameObj.Name避免腳本錯誤所有通過對象字面量創建的對象都連...
好吧,因為很重要的事情,幾天沒寫筆記了。
關於對象:
- ||可以用來填充預設值,如:myApp.name || "無"
- &&可以用來避免錯誤,myApp.NameObj有某種情況不存在,那麼可以用myApp.NameObj && myApp.NameObj.Name避免腳本錯誤
- 所有通過對象字面量創建的對象都連接到Object.prototype,當你創建某對象時也可以選擇另一個對象作為它的原型,比如:
if(typeof Object.beget!=='function'){ Object.create=function(o){ var F=function(){}; F.prototype=o; return new F(); }
} var another_stooge=Object.Create(stooge); - delete運算符可以刪掉對象的屬性,如:delete obj.name
- 為了減少全局變數的污染,可以創建一個唯一的全局變數對象,所有的全局變數都寫在這個全局變數對象里
關於函數:
- 對象字面量產生的字面量的原型都是Object.prototype,函數對象連接到Function.prototype.(該原型對象本身連接到Object.prototype)
- 除了聲明時定義的形式參數,每個函數還接收兩個附加的參數:this和arguments。this的值取決於調用的模式。
- JS中有四種調用模式:
- 方法調用模式
- 方法定義:如果一個函數被保存為對象的一個屬性,那麼就被稱為方法。
- 調用的時候this被綁定為該對象。
- 函數調用模式
- 就被當做一個函數來調用,this會被綁定為全局對象。
- 構造器調用模式
- 如果在一個函數前面帶上new來調用,那麼背地裡會創建一個連接到該函數的prototype成員的新對象
- 同時this會綁定到那個新對象上
- Apply調用模式
- 因為函數就是對象,所以函數也可以擁有方法,也就是Apply方法
- funcObj.Apply(obj,array),第一個值obj賦值給this,第二個值為參數數組,funcObj為函數對象
- 方法調用模式
- 實際參數和形式參數的數目不匹配並不會導致錯誤
- arguments數組表示實際傳進來的參數的數組,說是數組,實際上這是個數組對象,它沒有任何數組的方法。
- 擴充類型的功能:舉個慄子:
-
//下麵這個是本書添加新函數的方法 Function.prototype.AddMethod=function(funcName,func){ this.prototype[funcName]=func; return this; }; //根據數字正負來判斷使用Math.ceiling還是Math.floor Number.AddMethod('integer',function(){ return Math[this<0?'ceil':'floor'](this); }) document.writeln((-10/3).integer());
- 作用域的好處在於它可以訪問外部函數的參數和變數(除了this和arguments,當然有變通的手法,比如外部函數this或者arguments賦值給外部函數的一個變數)
- 閉包寫法:
- 你可以用閉包保護name這個變數,從而形成一個類似於私有變數的東西
- 所謂閉包,簡單來講,就是函數可以訪問它被創建時所處的上下文環境。
var getMyName=function(){ var name='Troy'; return { GetName:function(){ return name; }, SetName:function(newName){ name=newName; } } }();//註意這裡兩個括弧代表,這個最外圍的函數被直接執行了,所以getName其實是裡面的那個對象 getMyName.GetName();//結果為Troy getMyName.SetName("asd"); getMyName.GetName();//結果為asd
- 記憶功能實際上算是對遞歸的一種優化,就是在遞歸外用個數組樣的容器去保存遞歸的數據。
- 什麼模塊啊,柯里化其實就是對閉包的一種擴展,這裡就不記錄了