javascript(一)? 這是入門級別的講解
一、面向對象語言的要求
一種面向對象語言需要向開發者提供四種基本能力:
封裝 - 把相關的信息(無論數據或方法)存儲在對象中的能力
聚集 - 把一個對象存儲在另一個對象內的能力
繼承 - 由另一個類(或多個類)得來類的屬性和方法的能力
多態 - 編寫能以多種方法運行的函數或方法的能力
ECMAScript 支持這些要求,因此可被是看做面向對象的。
二、ECMAScript 對象類型
本地對象、內置對象、宿主對象
三、ECMAScript 對象作用域
作用域指的是變量的適用范圍
四、ECMAScript 定義類或對象
備注:了解以下內容的時候請對前面羅列的4點有所了解。
第一種:Object構造函數創建
var ?Person =new ?Object();
Person.name = 'HeFan';
Person.age = 24;
創建了Object引用類型的一個新實例,然后把實例保存在變量Person中,name和age是對象屬性。
第二種:使用對象字面量表示法
var Person = {};//相當于var Person = new Object();
var Person ={
name:'HeFan';
age:24;
}
對象字面量是對象定義的一種簡寫形式,目的在于簡化創建包含大量屬性的對象的過程。也就是說,第一種和第二種方式創建對象的方法其實都是一樣的,只是寫法上的區別不同
在介紹第三種的創建方法之前,我們應該要明白為什么還要用別的方法來創建對象,也就是第一種,第二種方法的缺點所在:它們都是用了同一個接口創建很多對象,會產生大量的重復代碼,就是如果你有100個對象,那你要輸入100次很多相同的代碼。那我們有什么方法來避免過多的重復代碼呢,就是把創建對象的過程封裝在函數體內,通過函數的調用直接生成對象。
第三種:使用工廠模式創建對象
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');
在使用工廠模式創建對象的時候,我們都可以注意到,在createPerson函數中,返回的是一個對象。那么我們就無法判斷返回的對象究竟是一個什么樣的類型。于是就出現了第四種創建對象的模式。
第四種:使用構造函數創建對象
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');
對比工廠模式,我們可以發現以下區別:
1.沒有顯示地創建對象
2.直接將屬性和方法賦給了this對象
3.沒有return語句
4.終于可以識別的對象的類型。對于檢測對象類型,我們應該使用instanceof操作符,我們來進行自主檢測:
alert(person1 instanceof Object);//ture
alert(person1 instanceof Person);//ture
alert(person2 instanceof Object);//ture
alert(person2 instanceof Object);//ture
同時我們也應該明白,按照慣例,構造函數始終要應該以一個大寫字母開頭,而非構造函數則應該以一個小寫字母開頭。
那么構造函數確實挺好用的,但是它也有它的缺點:
就是每個方法都要在每個實例上重新創建一遍,方法指的就是我們在對象里面定義的函數。如果方法的數量很多,就會占用很多不必要的內存。于是出現了第五種創建對象的
第五種:原型創建對象模式
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();
使用原型創建對象的方式,可以讓所有對象實例共享它所包含的屬性和方法。
如果是使用原型創建對象模式,請看下面代碼
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'? --來自實例alert(person2.name);//'Nike'? --來自原型
當為對象實例添加一個屬性時,這個屬性就會屏蔽原型對象中保存的同名屬性。
這時候我們就可以使用構造函數模式與原型模式結合的方式,構造函數模式用于定義實例屬性,而原型模式用于定義方法和共享的屬性
第八種:組合使用構造函數模式和原型模式
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');
以上就是我所總結的八種創建對象的方式,如有誤差,請望指出。
原文地址:http://www.cnblogs.com/zxza/p/6479070.html
推薦學習地址:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html (阮)