當Object 被做爲工具方法,而不是構造方法時,數組
Object(arg):包裝方法,將非對象類型包裝成一個對象函數
Object.create(proto[, propertiesObject]):工具
Object.getPrototypeOf(obj):性能
必須區分「構造函數的方法」和「實例對象的方法」。this
valueOf():返回當前對象對應的值。雙向綁定
toString():返回當前對象對應的字符串形式。
這個方法頗有用,能夠用於判斷對象類型code
toLocalString():返回當前對象對應的本地字符串形式。對象
hasOwnProperty():判斷某個屬性是否爲當前對象自身的屬性,仍是繼承自原型對象的屬性。繼承
isPrototypeOf():判斷當前對象是否爲另外一個對象的原型。ip
propertyIsEnumerable():判斷某個屬性是否可枚舉。
Object.getOwnPropertyDescriptor():獲取對象的屬性的精確描述模型
Object.defineProperty()
Object.defineProperties()
這兩個方法有性能損耗,會拖慢執行速度,不宜大量使用。
若是一個屬性的enumerable爲false,下面三個操做不會取到該屬性。
for..in循環
Object.keys方法
JSON.stringify方法(有時能夠利用這一點,爲對象添加註釋信息。)
所以,enumerable能夠用來設置「祕密」屬性。
遍歷對象屬性方法
Object.keys()
Object.getOwnPropertyNames()
通常狀況下,幾乎老是使用Object.keys方法,遍歷數組的屬性。
var o ={ $n : 5, get next(){return this.$n++ }, set next(n) { if (n >= this.$n) this.$n = n; else throw "新的值必須大於當前值"; } }; o.next // 5 o.next = 10; o.next // 10
利用存取器,能夠實現數據對象與DOM對象的雙向綁定。
對於簡單屬性,就直接拷貝,對於那些經過描述對象設置的屬性,則使用Object.defineProperty方法拷貝。
var extend = function (to, from) { var descriptor = Object.getOwnPropertyDescriptor(from, property); if (descriptor && ( !descriptor.writable || !descriptor.configurable || !descriptor.enumerable || descriptor.get || descriptor.set)) { Object.defineProperty(to, property, descriptor); } else { to[property] = from[property]; } }
JavaScript提供了三種方法,精確控制一個對象的讀寫狀態,防止對象被改變。最弱一層的保護是preventExtensions,其次是seal,最強的freeze。
Object.preventExtensions方法能夠使得一個對象沒法再添加新的屬性。能夠用delete命令刪除它的現有屬性。
判斷: Object.isExtensible(obj);
Object.seal方法使得一個對象既沒法添加新屬性,也沒法刪除舊屬性。
判斷: Object.isSealed(obj);
Object.freeze方法能夠使得一個對象沒法添加新屬性、沒法刪除舊屬性、也沒法改變屬性的值,使得這個對象實際上變成了常量。
判斷: Object.isFrozen(obj);
侷限性: 須要注意的是,使用上面這些方法鎖定對象的可寫性,可是依然能夠經過改變該對象的原型對象,來爲它增長屬性。