目錄
- 對象的定義
- 對象的分類
- 對象的創(chuàng)建
- 對象的相關操作
1篡石、對象的定義
ECMA-262 把對象定義為:“無序屬性的集合,其屬性可以包含基本值傅事、對象或者函數(shù)委造。”嚴格來講,這就相當于說對象是一組沒有特定順序的值。對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值销睁。
2供璧、對象的分類
對象可以分為三種類型,包括內建對象冻记、宿主對象和自定義對象睡毒。
-
內建對象
由ES標準中定義的對象,在任何的ES的實現(xiàn)中都可使用:Math
檩赢、String
吕嘀、Number
、Boolean
贞瞒、Function
偶房。 -
宿主對象
由JS運行環(huán)境提供的對象,目前主要指由瀏覽器提供的對象军浆,比如BOM
棕洋、DOM
。 -
自定義對象
由開發(fā)人員自己創(chuàng)建的對象乒融。
3掰盘、對象的創(chuàng)建
在js中創(chuàng)建對象的方法可分為6種,分別是:基本模式赞季、工廠模式愧捕、構造函數(shù)模式、原型模式申钩、組合模式次绘、動態(tài)原型模式。
①基本模式
var person = new Object();
person.name = "tutu";
person.age = 22;
}
②字面量模式
var person = {
name: "tutu",
age: 22
}
以上基本模式\字面量模式這兩種方法在使用同一接口創(chuàng)建多個對象時撒遣,會產(chǎn)生大量重復代碼邮偎,為了解決此問題,工廠模式被開發(fā)义黎。
③工廠模式
function person(name, age) {
var arr = new Object();
arr.name = name;
arr.age = age;
arr.sayName = function() {
alert(this.name);
}
return arr;
}
var person1 = person("tutu", 22);
var person2 = person("chaoren", 18);
工廠模式解決了重復實例化多個對象的問題禾进,但沒有解決對象識別的問題(但是工廠模式卻無從識別對象的類型,因為全部都是Object廉涕,不像Date泻云、Array等,本例中火的,得到的都是o對象壶愤,對象的類型都是Object,因此出現(xiàn)了構造函數(shù)模式)馏鹤。
④構造函數(shù)模式(大寫字母開頭)
function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = function() {
alert(this.name);
};
}
var person1 = new Person("tutu", 22);
var person2 = new Person("chaoren", 18);
與工廠模式的區(qū)別是:
- 沒有顯式地創(chuàng)建對象;
- 直接將屬性和方法賦給了 this 對象娇哆;
- 沒有 return 語句湃累。
構造函數(shù)也有其缺陷勃救,每個實例都包含不同的Function實例( 構造函數(shù)內的方法在做同一件事,但是實例化后卻產(chǎn)生了不同的對象治力,方法是函數(shù)蒙秒,函數(shù)也是對象)詳情見構造函數(shù)詳解,因此產(chǎn)生了原型模式宵统。
⑤ 原型模式
js中規(guī)定晕讲,每一個構造函數(shù)都有一個prototype屬性,指向另一個對象马澈,這個對象的所有屬性和方法瓢省,都會被構造函數(shù)的實例繼承,可以把那些不變的屬性和方法直接定義在prototype對象上痊班。
function person() {
}
person.prototype.name = "tutu";
person.prototype.age = "22";
person.prototype.sayName = function () {
return this.name + "年齡是" + this.age;
}
var person1 = new Person();
console.log(person1.name);
var person2 = new Person();
person2.name = "chaoren";
console.log(person2.name);
原型模式的好處是所有對象實例共享它的屬性和方法(即所謂的共有屬性)勤婚,此外還可以設置實例自己的屬性(方法)(即所謂的私有屬性),可以覆蓋原型對象上的同名屬性(方法)涤伐。
⑥構造函數(shù)和原型模式的混合模式
function person(name, age) {
this.name = name;
this.age = age;
}
person.prototype = {
sayName : function() {
return this.name + "年齡是" + this.age;
}
}
var person1 = new Person("tutu", 22);
混合模式是將構造函數(shù)模式用于定義實例屬性馒胆,原型模式用于定義方法和共享的屬性∧混合模式共享著對相同方法的引用祝迂,又保證了每個實例有自己的私有屬性。最大限度的節(jié)省了內存器净。
⑦動態(tài)原型模式
function person(name, age) {
this.name = name;
this.age = age;
if (typeof this.run != "function") {
person.prototype = {
run: function() {
return this.name + "年齡是" + this.age;
}
}
}
}
var person1 = new person("tutu", "22");
函數(shù)中使用if (typeof this.run != "function") 目的是為了防止創(chuàng)建多個對象時型雳,方法執(zhí)行多次。
4掌动、對象的相關操作
4.1 向對象中添加屬性
對象中保存的屬性包括屬性名和屬性值:屬性名是字符串四啰,屬性值可以是任意的數(shù)據(jù)類型,甚至也可以是一個對象粗恢。向對象中添加屬性有兩種方法:
語法1:對象.屬性名=屬性值
語法2:對象["屬性名"]=屬性值
4.2 讀取對象中的屬性
讀取對象中的屬性有兩種方法:
語法1:對象.屬性名
語法2:對象["屬性名"]
ps:如果讀取對象中沒有的屬性柑晒,不會報錯而是返回undefined
;使用語法2中的方法來讀取屬性時眷射,可在[ ]
中直接傳遞一個變量匙赞,這樣變量是什么就讀取什么屬性,比語法1的方法更靈活妖碉。
4.3 修改對象中的屬性
與向對象中添加屬性的兩種方法相同:
語法1:對象.屬性名=新值
語法2:對象["屬性名"]=新值
4.4 刪除對象中的屬性
刪除對象中的屬性方法為:
語法:delete 對象.屬性名
4.5檢查對象中是否包含指定的屬性
使用in
運算符來檢查對象中是否包含指定的屬性涌庭,如果有則返回true
,沒有返回false
:
語法:"屬性名" in 對象
這種方法如果對象中沒有創(chuàng)建此屬性但是原型中有這個屬性欧宜,結果也返回true
坐榆。
使用對象的hasOwnProperty()
來檢查自身是否含有該屬性,它只檢查自身是否含有該屬性冗茸,不含原型中的屬性席镀。
4.6 枚舉對象中的屬性
使用for...in
語句來枚舉對象中的屬性匹中。
語法:
for(var 變量 in 對象){
}
在這個for
循環(huán)中,對象有幾個屬性豪诲,循環(huán)體就執(zhí)行幾次顶捷,每次執(zhí)行時,都會將對象中的一個屬性名字賦值給變量屎篱。