說到js,很大一部分人會說我很熟悉,在日常的web開發中經常用,那麼你的js代碼是符合面對對象思路的嗎?那你會問我面向過程的js代碼有什麼不好嗎?我的感受是面對對象的js編碼更加簡潔,減少了混亂,可維護行增強,適合編寫富用戶端時應用。
好了,首先看看js裡如何定義對象:
<html><head><script type="text/javascript">var obj=new Object();obj.name='josh';obj.age='26';console.log(obj.name);console.log(obj.age);</script></head><body></body></html></span>
大家可以用firebug的console看下運行結果。在這段非常簡單的代碼中,我們new了一個Object型的對象,如果學過像java或C#這樣物件導向語言的人,對這樣的對象定義方式一定非常熟悉,只不過開頭的變數定義換成了var,這是由於js是弱類型的緣故。
Object類型屬於js的內建物件類型,定義了obj之後,我們給obj的name和age屬性進行了賦值。這裡需要注意的事,js的對象可以動態添加屬性和方法,不像java,對象只能包含類的內容。我們在上面的代碼中再添加兩個方法:
var obj=new Object();obj.name='josh';obj.age='26';obj.getName=function(){return this.name;}obj.getAge=function(){return this.age;}console.log(obj.getName());console.log(obj.getAge());
既然能添加,也能刪除:
var obj=new Object();obj.name='josh';obj.age='26';obj.getName=function(){return this.name;}obj.getAge=function(){return this.age;}delete obj.age;delete obj.getAge;console.log(obj.age); //undefinedconsole.log(obj.getAge()); //obj.getAge is not a function
那麼js對象的動態添加屬性方法的機制是什麼呢?在最根本的層面上,js對象是一個屬性的集合,非常類似於其他語言中的雜湊表,或者在java裡更為常用的map,因此我們可以再使用的任何時候,動態添加屬性或方法。
在js中,對象被認為是參考型別,為不同的變數賦相同對象的話,那麼執行的就是同一對象
var obj=new Object();obj.name='josh';obj.age='26';obj.getName=function(){return this.name;}obj.getAge=function(){return this.age;}obj1=obj;obj.age='30';console.log(obj1.getAge());
好了,上面的用的object對象,屬於js的內建對象,除了Object類型還有Function,Array,Date,Error,Regexp,這些內建物件類型都屬於參考型別
var func=new Function('console.log("Hi");');var arr=new Array('Eric','lisa','josh');var date=new Date();var error=new Error("something bad happen");var reg=new RegExp('\\d+');
js還提供了5中原始類型:分別是Boolean,Number,String,Null,Undefined。
//stringvar name='Eric';var selection='a';//numbervar num=10;var f=1.1;//booleanvar flag=false;//nullvar obj=null;//undefinedvar ref;
大家需要知道的事,Number類型既可以包含整形,也可以包含浮點型。這裡也需要說說null和undefined的區別,undefined表示變數定義了,但未初始化,null表示對象不存在。
之所以介紹原始類型,是因為大家平常會見到這樣的代碼:
var name='Eric';var lowcasename=name.toLowerCase(); //ericvar fistLetter=name.charAt(0); //E
就是在原始類型的的變數上調用了方法,這其實是js的內容為我們實現了一個裝箱的機制
var name='Eric';// 將原始類型使用new建立了一個對應的物件類型var temp=new String(name);var lowcasename=temp.toLowerCase(); //ericvar fistLetter=temp.charAt(0); //E
除了上述使用new的方式簡曆對象,還可以使用literal Form(字串)的方式
//new object 的方式var obj=new Object();obj.name='josh';obj.age='26';obj.getName=function(){return this.name;}obj.getAge=function(){return this.age;}//literal Formvar obj1={name:'josh',age:'26',getName:function(){return this.name;},getAge:function(){return this.age;}}//new Array的方式var arr=new Array('Eric','lisa','josh');//literal Formvar arr1=['Eric','lisa','josh'];
至此,本文講了 js對象動態增刪屬性及其機制,js的內建原始類型和參考型別 還有對象的兩種定義方式,有了這些基礎,我們後將陸續講解js對象的方方面面,包括繼承、封裝和多態。