開學次日,繼學習感悟1開始寫學習感悟2html
1.今天主要學習了面向對象的編程,Ecmascript主要包括兩種屬性,1是數據屬性,2是訪問器屬性,其中數據屬性有4個描述其行爲的特性(configurable、enumerable、writable、value)訪問器屬性一樣也包括4個屬性(configurable、enumerable、get、set)編程
2.面型對象有不少設計模式設計模式
(1)工廠模式數組
function creatPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayname = function(){ alert(this.name); }; return o; } var p1 = creatPerson("sun",21,"software engineer"); var p2 = creatPerson("che",23,"software engineer");
工廠模式雖然解決了多個類似對象的問題,可是卻沒有解決對象識別的問題(即怎樣知道一個對象的類型),這時候出現了構造函數模型函數
(2)構造函數模式學習
function creatPerson(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayname = function(){ alert(this.name); }; } var p1 = creatPerson("sun",21,"software engineer"); var p2 = creatPerson("che",23,"software engineer");
構造函數畢竟也是普通函數,能夠當作函數來使用,構造函數雖然好用,可是每一個方法都要在每一個實例上從新建立一遍,在前面的例子中,p1和p2都有一個sayname()方法,可是兩個方法不是同一個function實例,,雖然能夠將方法定義爲全局函數,可是定義多了全局函數多了就沒有絲毫封裝性可言,因而就引入了原型模式this
(3)原型模式prototype
function person(){ } person.prototype={ name:"sun", age:21, job:"software engineer", sayname:function(){ alert(this.name); } }; var p1 = new person(); p1.sayname();//sun var p2 = new person(); p2.sayname();//sun alert(p1.sayname == p2.sayname);//true
實例必定要在原型以後建立,重寫原型對象切斷了現有原型與以前已經存在的對象實例之間的聯繫,原型對象最大的問題是由其共享問題致使的設計
原型中有一個數組,實例v1向其push一個字符串,v2實例也會含有這個字符串,這正是不多有人單獨使用原型模式的緣由,最熱門的的組合使用 構造函數模式 + 原型模式htm
function person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["che","xi","sao","kang"]; } person.prototype={ constructor : person, sayname:function(){ alert(this.name); } }; var p1 = new person("sun",21,"ssoftware engineer"); var p2 = new person("pang",21,"girlfriend"); p1.friends.push("pang"); alert(p1.friends); alert(p2.friends); alert(p1.friends == p2.friends);//false alert(p1.sayname == p2.sayname);//true
3.匿名函數要必須定義在調用以前函數聲明則並不須要,由於函數聲明提高
function f(num){ if(num <=1){ return 1; } else { return num*arguements.callee(num-1);//減小耦合性 } }
4.重點理解
;(function(){
//這裏是塊級做用域
})();
將函數聲明轉換爲函數表達式只須要加個括號就ok