標籤:
第一次在園子發文:
關於js物件導向的理解:
工廠方式是什嗎?建構函式是什嗎?原形鏈?對象的引用?
1.對象是什嗎?
在js接觸的比較多的就是對象了,比如:
1 var arr = []; 2 3 arr.number = 10; //對象下面的變數:叫做對象的屬性 4 5 //alert( arr.number ); 6 //alert( arr.length ); 7 8 arr.a= function(){ //對象下面的函數 : 叫做對象的方法 9 alert(123);10 };11 12 arr.a(); // 123
通過 new Date() new String() 可以建立一個個對象。
2.工廠方式是什嗎?
//工廠方式 : 封裝函數function createPerson(name){ //1.原料 var obj = new Object(); //2.加工 obj.name = name; obj.showName = function(){ alert( this.name ); }; //3.出廠 return obj; }var p1 = createPerson(‘小明‘);p1.showName();
通過工廠方式,不需要new 一個函數,直接在函數內部建立一個新的對象,通過給新對象加屬性和方法,然後拋出。缺點是:不夠靈活。
3.建構函式是什嗎?
function CreatePerson(name){ this.name = name; this.showName = function(){ alert( this.name ); }; }var p1 = new CreatePerson(‘小明‘);p1.showName();
通過在函數外部new 一個函數,執行個體化了一個對象就是建構函式(一般函數名遵循大寫)。在函數內部this就指向了這個執行個體化的對象,而不是指向window。屬性和方法都掛載到了執行個體化的對象上面去了。缺點:每個方法都掛載在新建立的執行個體化對象上面,如果需要執行個體化很多個物件,就造成了效能浪費。
特別注意:
p1.showName() == p2.showName();//false 因為如上,方法在每個執行個體化對象上面,為瞭解決這個問題,出現了在原型上面加方法。
4.對象的引用:
//example 1:var a = [1,2,3];var b = a; b.push(4);alert(b); //1,2,3,4; // b沒有被賦值,只是把引用指向給了a,修改b就是修改a的值//example 2:var a = [1,2,3];var b = a;b = [1,2,3,4];alert(a); // 1,2,3 //雖然一開始b引用指向了a,但是後來b被賦值了,重新開創了記憶體單元,賦值成了[1,2,3,4],結果就沒有影響a// 物件類型:複製不僅僅是值的複製,也是引用的傳遞//example 3:var a = [1,2,3];var b = [1,2,3];alert(a == b); // 物件類型 必須值和引用都相同才等於
5.原型:
function CreatePerson(name){ this.name = name;}
//在建構函式原型上添加方法CreatePerson.prototype.showName = function(){ alert( this.name ); };var p1 = new CreatePerson(‘小明‘);p1.showName();var p2 = new CreatePerson(‘大白‘);p2.showName();alert(p1.showName() == p2.showName()) //true
//給數組原型添加方法:Array.prototype.sum = function(){ var result = 0; for(var i = 0; i<this.length; i++){ result += this[i]; } return result;}arr = [1,2,3];alert(arr.sum()); //6
javascript物件導向的理解(一)