javascript(一)? 這是入門級(jí)別的講解
一壳鹤、面向?qū)ο笳Z言的要求
一種面向?qū)ο笳Z言需要向開發(fā)者提供四種基本能力:
封裝 - 把相關(guān)的信息(無論數(shù)據(jù)或方法)存儲(chǔ)在對(duì)象中的能力
聚集 - 把一個(gè)對(duì)象存儲(chǔ)在另一個(gè)對(duì)象內(nèi)的能力
繼承 - 由另一個(gè)類(或多個(gè)類)得來類的屬性和方法的能力
多態(tài) - 編寫能以多種方法運(yùn)行的函數(shù)或方法的能力
ECMAScript 支持這些要求,因此可被是看做面向?qū)ο蟮摹?/p>
二疲牵、ECMAScript 對(duì)象類型
本地對(duì)象指厌、內(nèi)置對(duì)象凹蜂、宿主對(duì)象
三凉逛、ECMAScript 對(duì)象作用域
作用域指的是變量的適用范圍
四性宏、ECMAScript 定義類或?qū)ο?/h3>
備注:了解以下內(nèi)容的時(shí)候請(qǐng)對(duì)前面羅列的4點(diǎn)有所了解。
第一種:Object構(gòu)造函數(shù)創(chuàng)建
var ?Person =new ?Object();
Person.name = 'HeFan';
Person.age = 24;
創(chuàng)建了Object引用類型的一個(gè)新實(shí)例状飞,然后把實(shí)例保存在變量Person中毫胜,name和age是對(duì)象屬性书斜。
第二種:使用對(duì)象字面量表示法
var Person = {};//相當(dāng)于var Person = new Object();
var Person ={
name:'HeFan';
age:24;
}
對(duì)象字面量是對(duì)象定義的一種簡(jiǎn)寫形式,目的在于簡(jiǎn)化創(chuàng)建包含大量屬性的對(duì)象的過程酵使。也就是說荐吉,第一種和第二種方式創(chuàng)建對(duì)象的方法其實(shí)都是一樣的,只是寫法上的區(qū)別不同
在介紹第三種的創(chuàng)建方法之前口渔,我們應(yīng)該要明白為什么還要用別的方法來創(chuàng)建對(duì)象样屠,也就是第一種,第二種方法的缺點(diǎn)所在:它們都是用了同一個(gè)接口創(chuàng)建很多對(duì)象缺脉,會(huì)產(chǎn)生大量的重復(fù)代碼痪欲,就是如果你有100個(gè)對(duì)象,那你要輸入100次很多相同的代碼枪向。那我們有什么方法來避免過多的重復(fù)代碼呢勤揩,就是把創(chuàng)建對(duì)象的過程封裝在函數(shù)體內(nèi),通過函數(shù)的調(diào)用直接生成對(duì)象。
第三種:使用工廠模式創(chuàng)建對(duì)象
function ?createPerson(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 person1 = createPerson('Nike',29,'teacher');
var person2 = createPerson('Arvin',20,'student');
在使用工廠模式創(chuàng)建對(duì)象的時(shí)候绣的,我們都可以注意到芭概,在createPerson函數(shù)中,返回的是一個(gè)對(duì)象。那么我們就無法判斷返回的對(duì)象究竟是一個(gè)什么樣的類型桩蓉。于是就出現(xiàn)了第四種創(chuàng)建對(duì)象的模式。
第四種:使用構(gòu)造函數(shù)創(chuàng)建對(duì)象
function Person(name,age,job) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?this.name =name; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?this.age =age; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?this.job =job; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?this.sayName =function(){
? ? ? ? ? ? ? alert(this.name);
? ? ? ? ? ? };
}
var person1 = new ?Person('Nike',29,'teacher');
var person2 = new Person('Arvin',20,'student');
對(duì)比工廠模式蔬胯,我們可以發(fā)現(xiàn)以下區(qū)別:
1.沒有顯示地創(chuàng)建對(duì)象
2.直接將屬性和方法賦給了this對(duì)象
3.沒有return語句
4.終于可以識(shí)別的對(duì)象的類型。對(duì)于檢測(cè)對(duì)象類型,我們應(yīng)該使用instanceof操作符,我們來進(jìn)行自主檢測(cè):
alert(person1 instanceof Object);//ture
alert(person1 instanceof Person);//ture
alert(person2 instanceof Object);//ture
alert(person2 instanceof Object);//ture
同時(shí)我們也應(yīng)該明白,按照慣例膘壶,構(gòu)造函數(shù)始終要應(yīng)該以一個(gè)大寫字母開頭,而非構(gòu)造函數(shù)則應(yīng)該以一個(gè)小寫字母開頭。
那么構(gòu)造函數(shù)確實(shí)挺好用的万矾,但是它也有它的缺點(diǎn):
就是每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍,方法指的就是我們?cè)趯?duì)象里面定義的函數(shù)慎框。如果方法的數(shù)量很多良狈,就會(huì)占用很多不必要的內(nèi)存。于是出現(xiàn)了第五種創(chuàng)建對(duì)象的
第五種:原型創(chuàng)建對(duì)象模式
function Person(){}
Person.prototype.name= 'Nike';
Person.prototype.age= 20;
Person.prototype.jbo= 'teacher';
Person.prototype.sayName=function(){
alert(this.name);
};
var person1 =newPerson();
person1.sayName();
使用原型創(chuàng)建對(duì)象的方式笨枯,可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法薪丁。
如果是使用原型創(chuàng)建對(duì)象模式遇西,請(qǐng)看下面代碼
function Person(){}
Person.prototype.name= 'Nike';
Person.prototype.age= 20;
Person.prototype.jbo= 'teacher';
Person.prototype.sayName=function(){
alert(this.name);
};
varperson1 =newPerson();
varperson2 =newPerson();
person1.name='Greg';
alert(person1.name);//'Greg'? --來自實(shí)例alert(person2.name);//'Nike'? --來自原型
當(dāng)為對(duì)象實(shí)例添加一個(gè)屬性時(shí),這個(gè)屬性就會(huì)屏蔽原型對(duì)象中保存的同名屬性严嗜。
這時(shí)候我們就可以使用構(gòu)造函數(shù)模式與原型模式結(jié)合的方式粱檀,構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性
第八種:組合使用構(gòu)造函數(shù)模式和原型模式
function Person(name,age,job){
? ? ? ? this.name =name;
? ? ? ? this.age =age;
? ? ? ? ?this.job =job;
}
Person.prototype={
? ? ?constructor:Person,
? ? ? sayName:function(){
? ? ? ? ? alert(this.name);
? ? ? };
}
var person1 =new Person('Nike',20,'teacher');
以上就是我所總結(jié)的八種創(chuàng)建對(duì)象的方式漫玄,如有誤差茄蚯,請(qǐng)望指出。
原文地址:http://www.cnblogs.com/zxza/p/6479070.html
推薦學(xué)習(xí)地址:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html (阮)