1.對象是可變的,我們通過引用而非值來操作對象。如果變量x是指向一個對象的引用,那么執(zhí)行代碼var y = x;變量y也是指向同一個對象的引用,而非這個對象的副本。通過變量y修改這個對象亦會對變量x造成影響。
2.創(chuàng)建對象的3種方式:對象直接量、關鍵字new、Object.create()函數(shù)。
3.內(nèi)置構造函數(shù)的原型是只讀的:
Object.prototype = o;//賦值失敗,但是沒報錯,Object.prototype沒有修改;在嚴格模式中,任何失敗的屬性設置操作都會拋出一個類型錯誤異常。
4.delete只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型對象上刪除他,而且這會影響到所有繼承自這個原型的對象)
5.delete不能刪除那些可配置屬性為false的屬性。在嚴格模式下,匯報一個類型錯誤;非嚴格模式下,會返回false.
delete Object.prototype;//不能刪除,屬性是不可配置的
var x = 1;//聲明一個全局變量
delete this.x;//不能刪除
function f(){}//聲明一個全局函數(shù)
delete this.f;//也不能刪除全局函數(shù)
this.x = 1;//創(chuàng)建一個可配置的全局屬性
delete x;//非嚴格模式返回true,嚴格模式返回語法錯誤
delete this.x;//正常工作
6.==:null == undefined;//true
===:null === undefined;//false
7.getter和setter屬性(存取器屬性):存取器屬性不具有可寫性。如果屬性同時具有getter和setter方法,那么他是一個讀寫屬性。
var o = {
? ?//普通的數(shù)據(jù)屬性
data_prop:value,
//存取器屬性都是成對定義的函數(shù)
get accessor_prop() {/*函數(shù)體*/}//函數(shù)體內(nèi)可以使用this關鍵字。
set accessor_prop(value){/*函數(shù)體*/}
};
8.屬性的特性:Object.getOwnPropertyDescriptor()只能得到自有屬性的描述符。對于繼承屬性和不存在的屬性,返回undefined
9.對象的三個屬性:原型、類、可擴展性
10.檢測一個對象是否是另一個對象的原型(或處于原型鏈中),請使用isPrototypeOf()方法:
var p = {x:1};//定義一個原型對象
var o = Object.create(p);//使用這個原型創(chuàng)建一個對象
p.isPrototypeOf(o);//true:o繼承自p
Object.prototype.isPrototypeOf(o);//true:p繼承自Object.prototype
11.要想獲取對象的類,可以調(diào)用對象的toString()方法,然后提取已返回的字符串的第8個到倒數(shù)第二個位置之間的字符。由于很多對象繼承的toString()方法都重寫了,所以必須間接地調(diào)用Function.call()方法。Object.prototype.toString,call(o).slice(8,-1);
12.可擴展性:所有內(nèi)置對象和自定義對象都是顯示可擴展的,宿主對象的可擴展性是由JavaScript引擎定義的。
通過將對象傳入Object.esExtensible(),來判斷對象是否是可擴展的。如果想將對象轉換為不可擴展的,可使用Object.preventExtensions(),此操作不可逆,只影響對象本身,不影響原型的擴展性。
通過將對象傳入Object.isSealed(),來判斷對象是否封閉。Object.seal()除了將對象設置為不可擴展的,還可以將對象的所有自有屬性都設置為不可配置的。也就是說,不能給這個對象添加新屬性,而且他已有的屬性也不能刪除或配置,不過已有的可寫屬性依然可以設置。不能解封。
Object.freeze()凍結,除了將對象設置為不可擴展的和屬性設置為不可配置的之外,還可以將他的所有數(shù)據(jù)屬性設置為只讀的(如果對象的存取器屬性有setter方法則不受影響)。使用Object.isFrozen()檢測是否凍結。
//創(chuàng)建一個封閉對象,包含一個凍結的原型和一個不可枚舉的屬性
o.x;//==》1
o.x = 222;//==>1
o.y = 123;//==>123
Object.keys(o)//==>[]