一個最基本的面向對象寫法:
function Aaa(){ ? ? ? ? ? ? ? ? ? ? ?//創(chuàng)建一個構造函數(shù)
this.name = '小明'; ? ? ? ? ? ? ? ?//添加屬性
}
Aaa.prototype.showName = function(){ ? ? //添加方法
alert( this.name );
};
var a1 = new Aaa(); ? ? ? ? ? ? ? ? ? ? ? //通過new構造函數(shù)刹孔,創(chuàng)建一個對象,此對象擁有構造函數(shù)的方法和屬性
a1.showName(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? //調(diào)用屬性/方法
那么編寫面向對象的目的是什么序愚?為了能夠像系統(tǒng)對象如Array狼讨、Date的形式添加方法:
var arr=new Array();
arr.push();
arr.sort();
可以發(fā)現(xiàn)系統(tǒng)對象和面向對象使用形式非常類似,對象擁有其屬性及方法酝枢。其實JS源碼中纺蛆,系統(tǒng)對象也是基于原型的程序在辆。例如在JS源碼中的Array是這樣設計的:
function Array(){
this.length=0;
}
Array.prototype.push=function(){};
Array.prototype.sort=function() {};
由此自己編寫的時候不要去修改系統(tǒng)自帶的方法,會覆蓋原有方法泳姐,例如:
var arr=[1,2,3];
Array.prototype.push=function(){}; ? ? ? ? ? ?//push方法為空
arr.push(4,5,6) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //push方法失效
push方法在JS源碼中是如何做到的呢:
Array.prototype.push=function(){
//this : 1,2,3; this為數(shù)組本身效拭。arguments : 4,5,6 ?實參 。目標是讓4,5,6添加到this后面
for(var i=0;i<arguments.length;i++){
this[this.length]=arguments[i];
}
return this.length ? ? ? ? ? ? ? //push方法返回值為arr.length
};
既然JS是基于原型的的胖秒,舉個很普通的例子:
字符串方法:
var str="hello";
str.charAt(0);
str.indexOf("e");
顯然 alert(typeof str);彈出結果是String(基本數(shù)據(jù)類型)缎患。那么疑問產(chǎn)生,只有對象才能擁有方法阎肝,既然str是基本類型挤渔,那么他是怎么擁有方法的呢?這就涉及到了包裝對象
包裝對象:基本類型String风题、boolen判导、Number都有自己對應的包裝對象
var str=new String("創(chuàng)建了一個基本類型的包裝對象");
alert(typeof str) ? ? ? // Object 創(chuàng)建了一個字符串類型的包裝對象,此時str為一個對象
上文中可以看到JS方法是寫在構造函數(shù)的原型下沛硅,繼續(xù)引用上文例子:
var str="hello"; ? ? ? //聲明變量時眼刃,str是個字符串,不是對象
str.charAt(0); ??
String.prototype.charAt=function(){} ? ? ?//當字符串調(diào)用方法時摇肌,基本類型會找到對應的包裝對象擂红,然后包裝對象消失,因此給基本類型添加方法围小,只需添加到其所對應的包裝對象的原型即可:
var str="hello";
String.prototype.lastValue=function(){
return this.charAt(this.length-1);
}
alert(str.lastValue()); ? ? ?//o
var str="hello";
str.number=10; ? ? ? ? ?
alert( str.number ) ? ? ? ? //undefined 包裝對象消失,str為一個新對象吩抓,新對象str是個String類型
總結
包裝對象,可以把它認為是個不存在的疹娶。
當基本類型創(chuàng)建方法時,包裝對象就會出現(xiàn)雨饺,此時基本類型變成對象钳垮,運行到下一行代碼時包裝對象消失。這也是包裝對象存在的目的