亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript中的Object對象學習教程

2019-11-20 09:58:57
字體:
來源:轉載
供稿:網友

參數:
(1)obj
必需。Object 對象分配到的變量名稱。 
(2)值
可選。任一 JavaScript 基元數據類型(數字、布爾值或字符串)。  如果值是一個對象,則返回的對象是未修改的。  如果值是 null、“未定義”或“未提供”,則創建無內容的對象。 

Object對象的方法

Object作為構造函數使用時,可以接受一個參數。如果該參數是一個對象,則直接返回這個對象;如果是一個原始類型的值,則返回該值對應的包裝對象。利用這一點,可以寫一個判斷變量是否為對象的函數。

function isObject(value) { return value === Object(value);}

要在Object對象上面部署一個方法,有兩種做法。

部署在Object對象本身
部署在Object.prototype對象
Object.keys方法和Object.getOwnPropertyNames方法很相似,一般用來遍歷對象的屬性。它們的參數都是一個對象,都返回一個數組,該數組的成員都是對象自身的(而不是繼承的)所有屬性名。兩者區別在于,前者只返回可枚舉的屬性,后者還返回不可枚舉的屬性名。由于數組存在不可枚舉屬性length,因此一般使用Object.keys遍歷數組。

JavaScript沒有提供計算對象屬性個數的方法,可通過 Object.keys(o).length 和 Object.getOwnPropertyNames(o).length 獲取。

Object.observe方法用于觀察對象屬性的變化。

原型鏈相關方法:

Object.create():生成一個新對象,并該對象的原型。
Object.getPrototypeOf():獲取對象的Prototype對象。
Object實例對象的方法

Object.prototype.valueOf():valueOf方法的作用是返回一個對象的值,默認情況下返回對象本身。該方法的主要用途是,JavaScript自動類型轉換時會默認調用這個方法。

Object.prototype.toString():toString方法的作用是返回一個對象的字符串形式。當對象用于字符串加法時,會自動調用toString方法。

使用call方法,可以在任意值上調用Object.prototype.toString方法,從而判斷這個值的類型。不同數據類型的toString方法返回值如下:

數值:返回[object Number]
字符串:返回[object String]
布爾值:返回[object Boolean]
undefined:返回[object Undefined]
null:返回[object Null]
對象:返回”[object “ + 構造函數的名稱 + “]”

Object.prototype.toString.call(2) // "[object Number]"Object.prototype.toString.call('') // "[object String]"

利用這個特性,可寫出一個比typeof運算符更準確的類型判斷函數。

var type = function (o){ var s = Object.prototype.toString.call(o); return s.match(//[object (.*?)/]/)[1].toLowerCase();};type({}); // "object"type([]); // "array"type(5); // "number"

在上面這個type函數的基礎上,還可以加上專門判斷某種類型數據的方法。

['Null', 'Undefined', 'Object', 'Array', 'String', 'Number','Boolean', 'Function', 'RegExp', 'Element', 'NaN', 'Infinite'].forEach(function (t) { type['is' + t] = function (o) {  return type(o) === t.toLowerCase(); };});type.isObject({}); // truetype.isNumber(NaN); // falsetype.isElement(document.createElement('div')); // true

對象的屬性模型

在JavaScript內部,每個屬性都有一個對應的attributes對象,保存該屬性的一些元信息。使用Object.getOwnPropertyDescriptor方法,可讀取o對象的p屬性的attributes對象。attributes對象包含如下元信息:

value:表示該屬性的值,默認為undefined(只要writable和configurable有一個為true,就可以改動)。
writable:表示該屬性的值(value)是否可以改變,默認為true。
enumerable: 表示該屬性是否可枚舉,默認為true,也就是該屬性會出現在for…in和Object.keys()等操作中。一般來說,系統原生的屬性(即非用戶自定義的屬性)都是不可枚舉的。
表示“可配置性”,默認為true。如果設為false,表示無法刪除該屬性,也不得改變attributes對象(value屬性除外,如果writable為true,仍可改變value),也就是configurable屬性控制了attributes對象的可寫性。
表示該屬性的取值函數(getter),默認為undefined。
表示該屬性的存值函數(setter),默認為undefined。

var o = { p: 'a' };Object.getOwnPropertyDescriptor(o, 'p');// Object {//  value: "a",//  writable: true,//  enumerable: true,//  configurable: true// }

Object.defineProperty方法允許通過定義attributes對象,來定義或修改一個屬性,然后返回修改后的對象。格式如下:

Object.defineProperty(object, propertyName, attributesObject)
Object.defineProperty方法接受三個參數,第一個是屬性所在的對象,第二個是屬性名(它應該是一個字符串),第三個是屬性的描述對象。通過此方法定義屬性,屬性對象的writable、configurable、enumerable三個屬性的默認值都為false。

Object.defineProperty(o, "p", { value: "bar"});Object.getOwnPropertyDescriptor(o, 'p');// Object {//  value: "bar",//  writable: false,//  enumerable: false,//  configurable: false// }

如果一次性定義或修改多個屬性,可以使用Object.defineProperties方法。需要注意的是,一旦定義了取值函數get(或存值函數set),就不能將writable設為true,或者同時定義value屬性,否則會報錯。

var o = Object.defineProperties({}, { p1: {value: 123, enumerable: true}, p2: {value: "abc", enumerable: true}, p3: {  get: function () {   return this.p1 + this.p2  },  enumerable: true,  configurable: true }});

enumerable可以用來設置“秘密”屬性,如果一個屬性的enumerable為false,則 for..in 循環、Object.keys 方法和 JSON.stringify 方法都不會取到該屬性,但可以通過 o.xx 直接獲取它的值。

for…in循環和Object.keys方法的區別在于,前者包括對象繼承自原型對象的屬性,而后者只包括對象本身的屬性。如果需要獲取對象自身的所有屬性,不管enumerable的值,可以使用Object.getOwnPropertyNames方法。

可配置性決定了一個變量是否可以被刪除(delete)。當使用var命令聲明變量時,變量的configurable為false,而不使用var命令聲明變量時(或者使用屬性賦值的方式聲明變量),變量的可配置性為true。這說明,delete只能刪除對象的屬性。

var a1 = 1; // configurable: falsea2 = 1; // configurable: true(等價于this.a2 = 1)

除了直接定義以外,屬性還可以用存取函數(accessor)定義。其中,存值函數稱為setter,使用set命令;取值函數稱為getter,使用get命令。利用存取函數,可以實現數據對象與DOM對象的雙向綁定。

Object.defineProperty(user, 'name', { get: function () {  return document.getElementById("foo").value }, set: function (newValue) {  document.getElementById("foo").value = newValue; }, configurable: true});

控制對象狀態

JavaScript提供了三種方法,精確控制一個對象的讀寫狀態,防止對象被改變。最弱一層的保護是preventExtensions,其次是seal,最強的freeze。

Object.preventExtensions方法可以使得一個對象無法再添加新的屬性,但可以用delete命令刪除它的現有屬性。Object.isExtensible方法可以用來檢查是否可以為一個對象添加屬性。

Object.seal方法使得一個對象既無法添加新屬性,也無法刪除舊屬性。Object.seal還把現有屬性的attributes對象的configurable屬性設為false,使得attributes對象不再能改變。Object.isSealed方法用于檢查一個對象是否使用了Object.seal方法。

Object.freeze方法可以使得一個對象無法添加新屬性、無法刪除舊屬性、也無法改變屬性的值,使得這個對象實際上變成了常量。Object.isFrozen方法用于檢查一個對象是否使用了Object.freeze()方法。

使用上面這些方法鎖定對象的可寫性,但是依然可以通過改變該對象的原型對象,來為它增加屬性。

var o = new Object();Object.preventExtensions(o);var proto = Object.getPrototypeOf(o);proto.t = "hello";o.t// hello

一種解決方案是,把原型也凍結住。

var o = Object.seal( Object.create(Object.freeze({x:1}),   {y: {value: 2, writable: true}}));Object.getPrototypeOf(o).t = "hello";o.t // undefined

PS:
Object 對象包含在所有其他 JavaScript 對象中;它的所有方法和屬性均可用于所有其他對象。  方法可在用戶定義的對象中進行重新定義,并由 JavaScript 在適當時間調用。   toString方法是頻繁重新定義的 Object 方法的一個示例。 
在此語言參考中,每個 Object 方法的說明均包括內部 JavaScript 對象的默認和對象特定的實現信息。
IE兼容方面,微軟MSDN文檔的話是”已在 Internet Explorer 6 之前的 Internet Explorer 中引入 Object Object“,所以不用擔心~

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久99精品久久久久| 中文字幕日本精品| 中文字幕视频在线免费欧美日韩综合在线看| 91av在线精品| 日本一本a高清免费不卡| 久久久久久久国产精品视频| 国产精品第一视频| 亚洲一品av免费观看| 亚洲一区中文字幕| 91免费看片在线| 国产精品网站视频| 日韩中文字幕国产精品| 亚洲成色999久久网站| 91精品视频大全| 久久在线免费观看视频| 岛国av一区二区三区| 欧美尤物巨大精品爽| 欧美激情一级欧美精品| 欧洲成人免费视频| 精品久久久久久久久久| 欧美一级电影免费在线观看| 少妇精69xxtheporn| 亚洲人成77777在线观看网| 大伊人狠狠躁夜夜躁av一区| 亚洲国产成人爱av在线播放| 国产一区香蕉久久| 91国产美女在线观看| 国产欧美日韩精品专区| 精品中文视频在线| 国产一区二区精品丝袜| 国产精品成人aaaaa网站| 成人美女av在线直播| 热久久视久久精品18亚洲精品| 91中文字幕在线观看| 日韩欧美精品网站| 亚洲天堂av网| 久久精品国产69国产精品亚洲| 日韩成人xxxx| 久久精品99无色码中文字幕| 久久久久国产精品一区| 欧美精品18videosex性欧美| 亚洲tv在线观看| 欧美日韩爱爱视频| 亚洲日本成人网| 欧美精品第一页在线播放| xvideos国产精品| 91在线免费看网站| 国产精品va在线播放| 欧美成人黄色小视频| 欧美成人免费一级人片100| 欧美—级高清免费播放| 成人性生交大片免费看视频直播| 亚洲精品成a人在线观看| 国产精品久久久久久久久久小说| 国产成人一区三区| 亚洲色图激情小说| 国产美女久久精品香蕉69| 欧美性高跟鞋xxxxhd| 欧美国产视频一区二区| 欧美丝袜一区二区三区| 91在线视频精品| 日韩精品中文字幕在线| 日韩av片电影专区| 亚洲a成v人在线观看| 国产精品免费一区二区三区都可以| 在线成人激情黄色| 欧美日韩亚洲视频一区| 欧美最猛性xxxxx亚洲精品| 在线观看91久久久久久| 国产福利精品在线| 综合欧美国产视频二区| 成人两性免费视频| 日本韩国欧美精品大片卡二| 国产91精品久久久久久久| 亚洲大胆美女视频| 欧美性xxxxx极品娇小| 欧美激情在线观看视频| 亚洲人午夜色婷婷| 国产成人小视频在线观看| 国产欧美婷婷中文| 精品国产电影一区| 欧美理论片在线观看| 亚洲精品999| 亚洲欧美国内爽妇网| 国产91成人在在线播放| 疯狂欧美牲乱大交777| 亚洲成年网站在线观看| 韩国福利视频一区| 亚洲成年网站在线观看| 日韩大片免费观看视频播放| 久久久久久久电影一区| 亚洲人成网站免费播放| 日韩av最新在线| 55夜色66夜色国产精品视频| 国产一区二区三区视频在线观看| 亚洲视频免费一区| 久久久久久91香蕉国产| 中文字幕一精品亚洲无线一区| 欧美黑人一区二区三区| 亚洲欧美国产日韩天堂区| 久久久久久久999| 欧美日韩在线看| 亚洲人成电影网站色…| 亚洲成人xxx| 欧美成人免费网| 亚洲精品国精品久久99热一| 亲爱的老师9免费观看全集电视剧| 国产精品自产拍高潮在线观看| 亚洲男人天堂网| 91夜夜未满十八勿入爽爽影院| 国产丝袜一区二区三区免费视频| 一色桃子一区二区| 91精品在线一区| 777国产偷窥盗摄精品视频| 欧美人交a欧美精品| 欧美午夜激情小视频| 亚洲成色777777在线观看影院| 久久精品在线视频| 日韩电影中文字幕在线| 国产精品国产自产拍高清av水多| 欧美日韩另类视频| 国产免费成人av| 亚洲香蕉成人av网站在线观看| 欧美老女人在线视频| 国产91色在线| 欧洲精品在线视频| 欧美在线视频网站| 国模叶桐国产精品一区| 青青草成人在线| 亚洲va欧美va国产综合久久| 国产精品99久久久久久白浆小说| 中文在线资源观看视频网站免费不卡| 成人av在线亚洲| 亚洲精品自产拍| 精品久久久免费| 国产丝袜精品视频| 亚洲国产天堂网精品网站| 精品亚洲一区二区| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美亚洲视频在线看网址| 国产va免费精品高清在线观看| 国产精品高潮呻吟久久av无限| 久久久免费精品| 国产精品视频地址| 亚洲国产成人久久综合一区| 蜜臀久久99精品久久久无需会员| 欧美性资源免费| 国产成人精品久久久| 91精品国产乱码久久久久久久久| 国产日韩欧美影视| 91精品国产自产在线观看永久| 欧美性高跟鞋xxxxhd| 欧美视频免费在线| 日韩激情视频在线播放| 亚洲成人av在线播放| 麻豆国产精品va在线观看不卡| 久久久久久亚洲精品中文字幕| 大量国产精品视频| 日韩欧美一区视频| 日韩精品在线电影| 国产精品入口日韩视频大尺度| 亚洲精品456在线播放狼人| 精品久久久久久久久久久| 欧美日韩国产色|