javascript中如何建立物件?
javascript是一種“基於prototype的面嚮物件語言“,與java有非常大的區別,無法通過類來建立物件。那麼,既然是面象物件的,如何來建立物件呢?
JavaScript中建立物件的方法如下:
一:使用new關鍵字呼叫構造器建立物件(常用);
在JavaScript中,所有的函式名可以看成一個類名;
函式名和其引數可以看成一個構造器用於構造物件;
使用建構函式模式建立物件的幾點注意事項:
(1):沒有明顯的建立物件
(2):直接將屬性和方法賦給this物件
(3):沒有return語句
(4):建立Student例項的時候,必須要使用new操作符;
functionStudent(name,age){ this.name=name;//this是當前物件的引用; this.age=age; } var s1=new Student();//沒有傳入引數,函式裡面的name,age是undefine var s2=new Student("wangshicheng",20); document.write(s1.name+s1.age);//都是undefine; document.write(s2.name+s2.age);//都是傳入實參的值;
二:使用Object直接建立物件
var myObj=new Object();//使用Object類建立一個空的物件myObj.name="wangshihcheng"; myObj.age=20; myObj.infor=function(){ document.write("名字:"+this.name);//this.的指向問題 document.write("年齡:"+this.age); } myObj.infor();//呼叫建立的物件裡面的方法;
三:使用程式碼塊(JSON)建立物件的語法(最常用)
//object={屬性名1:屬性值1,屬性名2:屬性值2,.....}
//注意JOSN格式中屬性名要加雙引號;
var p={ "name":"wangsch", "gender":"man","age":40, "son":[ { "name":"son1", "age":2 }, { "name":"son2", "age":5 } ], "infor":function(){ document.write("父親的姓名:"+this.name+",父親的年齡:"+this.age+"<br>"); for( var child in this.son ){ document.write("兒子的姓名:"+this.son[child].name+",兒子的年齡:"+this.son[child].age+"<br>"); } } } p.infor();//呼叫物件p中的infor方法
四:原型模式建立物件
在JavaScript中,每個函式都有一個prototype屬性,它是一個指標,指向一個物件,叫做
原型物件,原型物件包含了可以由特定型別的所有例項物件共享的屬性和方法;
另外,這個物件有一個自帶的屬性constructor,指向建立物件的構造方法;
當我們使用原型模式時可以使所有的例項共享原型物件的屬性和方法,
從而我們不必要早建構函式中定義物件的例項的資訊;
function Student(){ } Student.prototype.name="wang"; Student.prototype.sex="man"; Student.prototype.class="5"; Student.prototype.sayName=function(){ console.log(this.name); } var s1=new Student(); s1.sayName();//wang var s2=new Student(); s2.sayName();//wang s2.name="shicheng"; s2.sayName();//shicheng
當我們讀取某個物件的屬性時,都會執行一次搜尋,搜尋首先從物件例項本身開始,
如果在例項中找到了這個屬性,則搜尋結束,返回屬性的值;
若例項上沒有找到,則繼續向物件的原型物件上面延申,搜尋物件的原型物件,若在原型上面
找到這個屬性,則返回原型上面屬性對應的值,若沒有找到,則返回undefine;
因此,可以看出,例項物件屬性會覆蓋原型物件上面的屬性;
五:組合使用建構函式和原型模式
建構函式用於定義例項的屬性,原型模式則用於定義方法和共享的屬性;
function Student(name,sex,grade){ this.name=name; this.sex=sex; this.grade=grade; } Student.prototype.sayName=function(){ console.log(this.name); } Student.prototype.school="nongda";
這種混合模式可以支援想建構函式傳入引數,還極大的節約了記憶體。