目錄
- 創(chuàng)建對象
- 對象直接量
- 通過new創(chuàng)建對象
- 原型
- Object.create()
- 屬性的查詢和設(shè)置
- 刪除屬性
- 檢測屬性
- 序列化對象
- 總結(jié)
創(chuàng)建對象
對象直接量
對象直接量是由若干名/值對組成的映射表,名/值對中間用冒號分隔,名/值對之間用逗號分隔,整個映射表用花括號括起來。
var empty = {};
var point = { x:0, y:0};
var point2 = {x:point.x, y:point.y+1};
var book = {
"main title":"JavaScript",
//屬性名字里有空格,必須用字符串表示
"sub-title":"The",
//屬性名字里有連字符,必須用字符串表示
"for":"all",
//"for"是保留字,必須用字符串表示
author:{
//這個屬性的值是一個對象
name:"123"
//注意,在里的屬性名都沒有引號
}
};
通過new創(chuàng)建對象
var o = new Object();
//創(chuàng)建一個空對象,和{}一樣
var a = new Array();
//創(chuàng)建一個空數(shù)組,和[]一樣
var d = new Date();
//創(chuàng)建一個表示當前時間的Date對象
var r = new RegExp("js");
//創(chuàng)建一個可以進行匹配的RegExp對象
原型
所有通過對象直接量創(chuàng)建的對象都具有同一個原型對象,并可以通過JavaScript代碼Object.prototype獲得對原型對象的引用。通過關(guān)鍵字new和構(gòu)造函數(shù)調(diào)用創(chuàng)建的對象的原型就是構(gòu)造函數(shù)的prototype屬性的值。因此,同使用{}創(chuàng)建對象一樣,通過new Object()創(chuàng)建的對象也繼承自O(shè)bject.prototype。同樣,通過new Array()創(chuàng)建的對象的原型就是Array.prototype,通過new Date()創(chuàng)建的對象的原型就是Date.prototype。
沒有原型的對象為數(shù)不多,Object.prototype就是其中之一。它不繼承任何屬性。其他原型對象都是普通對象,普通對象都具有原型。所有的內(nèi)置構(gòu)造函數(shù)(以及大部分自定義的構(gòu)造函數(shù))都具有一個繼承自O(shè)bject.prototype的原型。例如,Date.prototype的屬性繼承自O(shè)bject.prototype,因此由new Date()創(chuàng)建的Date對象的屬性同時繼承自Date.prototype和Object.prototype。這一系列鏈接的原型對象就是所謂的“原型鏈”(prototype chain)。
Object.create()
創(chuàng)建一個新對象,其中第一個參數(shù)是這個對象的原型。Object.create()提供第二個可選參數(shù),用以對對象的屬性進行進一步描述。
Object.create()是一個靜態(tài)函數(shù),而不是提供給某個對象調(diào)用的方法。使用它的方法很簡單,只須傳入所需的原型對象即可:
var AB = Object.create({x:1,y:2});
屬性的查詢和設(shè)置
var a = book.author;
//得到book的"author"屬性
book.edition = 6;
//給book創(chuàng)建一個名為"edition"的屬性并賦值
book["main title"] = "123"
//給"main title"屬性賦值
繼承
假設(shè)要查詢對象o的屬性x,如果o中不存在x,那么將會繼續(xù)在o的原型對象中查詢屬性x。如果原型對象中也沒有x,但這個原型對象也有原型,那么繼續(xù)在這個原型對象的原型上執(zhí)行查詢,直到找到x或者查找到一個原型是null的對象為止。
var o = {}
o.x = 1;//給o定義一個屬性x
var p = inherit(o);//p繼承o
p.y = 2;//給p定義一個屬性y
var q = inherit(p);//q繼承p
q.z = 3;//給q定義一個屬性z
q.x + q.y // 3 x和y分別繼承自o和p
屬性賦值操作首先檢查原型鏈,以此判定是否允許賦值操作。如果允許屬性賦值操作,它也總是在原始對象上創(chuàng)建屬性或?qū)σ延械膶傩再x值,而不會去修改原型鏈。
var u = { r:1 };
var c = inherit(u);
c.x = 1; c.y =1;
c.r =2;
u.r; // 1 原型對象沒有修改
屬性訪問錯誤
當book沒有a屬性
book.a // undefined
var l = book.a.length;
//拋出一個類型錯誤異常,undefined沒有屬性
刪除屬性
delete運算符可以刪除對象的屬性。
delete book.author;
//book不再有屬性author
delete book["main title"];
//book不再有屬性"main title"
delete運算符只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型對象上刪除它,而且這會影響到所有繼承自這個原型的對象)。
當delete表達式刪除成功或沒有任何副作用(比如刪除不存在的屬性)時,它返回true。如果delete后不是一個屬性訪問表達式,delete同樣返回true:
o = {x:1};
delete o.x; //刪除x,返回true
delete o.x; //什么都沒做(x已經(jīng)不存在了),返回true
delete o.toString; //什么也沒做(toString是繼承來的),返回true
delete 1; //無意義,返回true
delete不能刪除那些可配置性為false的屬性
在這些情況下的delete操作會返回false:
delete Object.prototype;//不能刪除,屬性是不可配置的
var x = 1; //聲明一個全局變量
delete this.x; //不能刪除這個屬性
function f (){}//聲明一個全局函數(shù)
delete this.f; //也不能刪除全局函數(shù)
檢測屬性
in運算符的左側(cè)是屬性名(字符串),右側(cè)是對象。如果對象的自有屬性或繼承屬性中包含這個屬性則返回true:
var o = { x:1 }
"x" in o; //true "x"是o的屬性
"y" in o; //false "y"不是o的屬性
"toString" in o; //true o繼承toString屬性
對象的hasOwnProperty()方法用來檢測給定的名字是否是對象的自有屬性。對于繼承屬性它將返回false:
var o = { x:1 }
o.hasOwnProperty("x");//true o有一個自有屬性x
o.hasOwnProperty("y");//false o中不存在屬性y
o.hasOwnProperty("toString");//false toString是繼承屬性
propertyIsEnumerable()是hasOwnProperty()的增強版,只有檢測到是自有屬性且這個屬性的可枚舉性(enumerable attribute)為true時它才返回true。
var o = inherit({ y:2});
o.x = 1;
o.propertyIsEnumerable("x"); //true o有一個可枚舉的自有屬性x
o.propertyIsEnumerable("y"); //false y是繼承來的
Object.propertyIsEnumerable("toString"); //false 不可枚舉
除了使用in運算符之外,另一種更簡便的方法是使用“!==”判斷一個屬性是否是undefined:
var o = { x:1 }
o.x !== undefined; //true o中有屬性x
o.y !== undefined; //false o中沒有屬性y
o.toString !== undefined; //true o繼承了toString屬性
序列化對象
對象序列化(serialization)是指將對象的狀態(tài)轉(zhuǎn)換為字符串,也可將字符串還原為對象。ECMAScript 5提供了內(nèi)置函數(shù)JSON.stringify()和JSON.parse()用來序列化和還原JavaScript對象。這些方法都使用JSON作為數(shù)據(jù)交換格式,JSON的全稱是“JavaScript Object Notation”
o = {x:1, y:{z:[false,null,""]}};
s = JSON.stringify(o);
//s是'{"x":1,"y":{"z":[false,null,""]}}'
p = JSON.parse(s);
// p == o
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
您可能感興趣的文章:- Java讀取項目json文件并轉(zhuǎn)為JSON對象的操作
- JavaScript面向?qū)ο笾甤lass繼承類案例講解
- jsp Response對象頁面重定向、時間的動態(tài)顯示
- JS對象數(shù)組去重的3種方法示例及對比
- nodejs將JSON字符串轉(zhuǎn)化為JSON對象報錯的解決