物件的定義:無序屬性的集合,屬性的值可以是基本值、物件或者函式.
每個物件都是基於乙個應用型別建立的,這個引用型別可以是內建的(例如object
array
math
),也可以是使用者自定義的.
所有的物件都是繼承自object的,因此我們可以從object著手建立物件.
//通過new 關鍵字建立物件
var person = new ojbect();
person.name = 'yuhualinfeng';
person.age = 30;
person.job = 'web developer';
//通過物件字面量建立物件
var person = {};
person.name = 'yuhualinfeng';
person.age = 30;
person.job = 'web developer';
基於object建立物件有兩種形式,一種是使用new關鍵字,另一種是使用物件字面量.
使用這種方式建立物件的缺點是:當建立多個相同型別的物件時,會產生許多重複的**,假如我要三個person物件,我就需要寫三相同結構的**,為了解決這個問題,我們引入了工廠模式建立物件.
工廠模式是軟體工廠領域一種廣為認知的設計模式,這種模式抽象了建立具體物件的過程.
function createperson(name,age,job)
var person1 = createperson('yuhualingfeng',30,'web developer');
var person2 = createperson('obama',45,'president');
我們建立了兩個人物物件,假如我們基於object建立物件,那麼createperson
內的**就會重複編碼.
但是使用這種模式建立的物件任然有乙個問題:無法得知建立的物件的型別名.解決這問題的可行方法是使用建構函式建立物件.
function person(name,age,job)
}var person1 = new person('yuhualingfeng',30,'web developer');
var person2 = new person('obama','45','president');
這裡我們建立了乙個名為person的引用型別,然後我們用new 關鍵字例項化此引用型別,這個過程可以細化為以下四個過程:
建立乙個新物件
將建構函式的作用域賦值給新函式(因此this就指向這個新物件)
執行建構函式中的**(為this物件賦值,等同於為新物件賦值)
返回新物件
我們可以用instanceof
來檢測person1,person2的物件型別是否為person.
alert(person1 instanceof person); //true
alert(person2 instanceof person); //true
alert(person1 instanceof object); //true 因為person繼承自object,所以這裡一樣成立.
注:
細心的朋友應該會注意到,這裡的建構函式的首字母是大寫,這裡們遵循乙個規範,普通函式的首字母大寫,普通函式的首字母小寫.
建構函式也有自己的缺點,大家可以看到person包含乙個sayname的函式(方法),函式也是物件(函式式function的例項),所以每例項化乙個person,就會產生乙個sayname方法,也就是乙個物件,
隨著建立的person例項怎多,產生的物件也相應增多,最終導致更多的記憶體,那麼我們能不能找到更好的解決辦法呢,答案是肯定的.
我們每建立乙個函式都有乙個prototype(原型)屬性,這個屬性是乙個指標,指向乙個物件而這個特定物件的用途是包含可以由特定型別的所有例項共享的屬性和方法.這就意味著原型物件不會因為例項的增多二占用
更多的記憶體.每個原型物件都預設有乙個constructor屬性,故名思議,這個屬性指向建構函式.下面展示了通過原型物件來建立物件.
function person()
person.prototype.name = "yuhualingfeng";
person.prototype.age = 30;
person.prototype.job = "web developer";
person.prototype.sayname=function();
var person1 = new person();
person.sayname(); //yuhualingfeng
var person2 = new person();
這裡person.prototype.constructor指向的是person.當然你也可以向下面這樣直接給原型物件賦值來建立物件.
person.prototype=;
這裡之所以新增了constructor屬性是應為直接給原型物件賦值會把原型物件的指標指向另乙個物件,以前預設的值將無法訪問到.
isprototypeof
:判斷是某物件否為例項的原型.
alert(person.prototype.isprototypeof(person)); //true
hasownproperty
:檢測某屬性是存在於例項中,還是原型物件中.
alert(person1.hasownproperty('name')); //false,因為屬性存在於原型中.
in
操作符:in操作符有兩種使用方式,一種是單獨使用,一種是和for搭配使用,單獨使用的作用是判斷某屬性是否在某例項中訪問到(無論是在例項自身的還是原型物件中的),for-in
是列舉(迴圈)中使用.
//判斷屬性是否存在原型中
function hasprototypeproperty(object,name)
原型模式建立物件的缺點:例項的原型物件是共享的,當修改乙個例項的屬性,如果屬性的值為方法或者基本型別時,不會有什麼影響,當屬性為引用型別時,會影響其他例項的屬性值.
綜合建構函式模式和原型模式建立物件,我們結合他們的優點,去粗取精,我們組合使用建構函式模式原型模式.
通過建構函式建立物件的缺點是每個方法都會在例項上重新建立,造成不必要的記憶體消耗;通過原型建立物件的缺點在於例項引用型別值的屬性會相互影響.綜上考慮,我們可以把儲存值得屬性放在建構函式中,把方法放在原型物件中.這種模式是建立物件使用最廣泛的一種,可以說是建立物件的預設模式.
function person(name,age,job)
person.prototype =
};var person = new person('yuhualingfeng',30,'web developer');
person.sayname();
以上就是建立物件的幾種模式,大家可以結合它們的優缺點和你自身建立物件的用處進行權衡,然後選擇適合你的建立物件的模式. JS物件導向程式設計之建立物件模式
function createperson name,age,job return o var person1 createperson nicholas 29,software engineer var person2 createperson greg 27,doctor 優點 抽象了建立具體物...
物件導向程式設計 建立物件
方法一 物件字面量 方法二 object建構函式 方法三 工廠模式 function createperson name,age,job person.prototype.name nicholas perosn.protptype.age 29 person.prototype.job soft ...
物件導向程式設計之術語
術語 含義屬性 一小段資訊,例如顏色 高度或重量,描述物件的乙個特性 字段物件內部的指定值 操作屬於物件的一段 方法操作的同義詞 訊息從乙個物件傳送到另乙個物件的請求 呼叫執行操作,以響應訊息 執行呼叫的同義詞 關聯兩個物件之間的直接或間接連線 聚合強關聯,隱含著某種部分 一體層次結構 復合強聚合,...