摘要:對象是屬性的無序集合。使用對象直接量創(chuàng)建的對象的原型就是,使用運算符創(chuàng)建的對象的原型是構(gòu)造函數(shù)的的值。主要目的是將對象鎖定,避免外界干擾。判斷對象是否封閉。刪除屬性可刪除對象的自有屬性且為的屬性。
對象是屬性的無序集合。因此,這一章主要從對象和屬性兩個方面來闡述。
對象是屬性的無序集合,也可以看做是從字符串到值的映射。1.2 對象的分類
對象可分為三類: - 內(nèi)置對象(native object):由ECMAScript規(guī)范定義的對象。如數(shù)組、函數(shù)、日期、正則表達式等都是內(nèi)置對象。 - 宿主對象(host object):JS解釋器所嵌入的宿主環(huán)境(比如Web瀏覽器)定義的。如客戶端JS中的HTMLElement對象就是宿主對象。 - 自定義對象(user-defined object):運行中的JS代碼創(chuàng)建的對象。1.3 對象的操作 1.3.1 創(chuàng)建對象
創(chuàng)建對象主要有3種方法:對象直接量、new運算符、Object.create() (1) 對象直接量: `var empty = {}` `var point = {x:0,y:0}` (2) new運算符:new + 函數(shù)調(diào)用(該函數(shù)稱為構(gòu)造函數(shù)constructor).使用對象直接量創(chuàng)建對象相當于使用 new Object() (3) `Object.create()` **每一個JS對象(null除外)都和另一個對象相關(guān)聯(lián),另一個對象就是該對象的原型。** 使用對象直接量創(chuàng)建的對象的原型就是Object.prototype,使用new運算符創(chuàng)建的對象的原型是構(gòu)造函數(shù)的prototype的值。 Object.create()接受兩個參數(shù)。第一個是要創(chuàng)建的對象的原型對象,第二個可選,內(nèi)容是屬性描述符。 對于前兩種創(chuàng)建對象的方法,用Object.create()表示即為:Object.create(Object.prototype),Object.create(Func.prototype). 當有第二個參數(shù)時:
var bob = Object.create(userB, { "id" : { value: MY_GLOBAL.nextId(), enumerable:true // writable:false, configurable(deletable):false by default }, "name": { value: "Bob", enumerable: true } });1.3.2 序列化對象
對象序列化是指將對象的狀態(tài)轉(zhuǎn)化為字符串,也可將字符串還原為對象。函數(shù)、RegExp、Error、undefined值不能序列化和還原。 `JSON.stringify()`將任意的JavaScript值序列化成JSON字符串,并且**只能序列化對象的可枚舉屬性**。 `JSON.parse()`將一個 JSON 字符串解析成為一個 JavaScript 值。1.4 對象的方法
所有的對象都會從Object.prototype繼承屬性和方法(除了以null為原型),這里先介紹Object.prototype的幾個方法,其他的將會在后面的部分介紹。 - `toString()`:返回調(diào)用這個方法的對象值的字符串。返回信息少。在需要將對象轉(zhuǎn)換為字符串的時候,JS會調(diào)用這個方法。 - `toLocaleString()`:返回對象的本地化字符串。Object的該方法調(diào)用toString(),Date 和 Number 則對日期、數(shù)字做本地化的轉(zhuǎn)換。 - `valueOf()`:返回對象的原始值。1.5 對象的屬性
- 原型屬性:每個對象都有一個原型(Object.prototype除外),ECMAScript提供了兩種方法查詢對象的原型。 a. `Object.getPrototypeOf()`:返回作為參數(shù)傳入的對象的原型。 b. `isPrototypeOf()`:檢測一個對象是否是另一個對象的原型。p.isPrototypeOf(o)檢測p是否是o的原型。 - 可擴展性:是否可以給對象添加新屬性。主要**目的是將對象鎖定,避免外界干擾**。關(guān)于可擴展性有以下幾種方法: a. `Object.isExtensible()` :檢測傳入的對象是否是可擴展的,返回布爾值。 b. `Object.preventExtens()` :將對象設(shè)置為不可擴展的,意味著不能給對象添加新的屬性。**將對象設(shè)置為不可擴展后不能重新設(shè)置為可擴展。** c. `Object.seal()`:將對象設(shè)置為不可擴展+不可配置自有屬性,意味著不能給對象添加新的屬性+不能對已有屬性進行刪除或配置。 d. `Object.isSeal()`:判斷對象是否封閉(seal)。 e. `Object.freeze()`:不可擴展+不可配置+數(shù)據(jù)屬性只讀。 f. `Object.isFrozen()`判斷對象是否凍結(jié)(freeze)2.屬性 2.1 屬性的分類
a.按照原型和繼承可分為: 繼承屬性和自由屬性。 b.按照屬性的描述符可分為: 數(shù)據(jù)屬性和存取器屬性(accessor property)。2.2 屬性的描述符
屬性的描述符主要是對針對屬性可以進行的操作的描述。 數(shù)據(jù)屬性和存取器屬性共有的屬性描述符是: - enumerable:是否可枚舉,即能佛歐通過for/in 或者 Object.keys()循環(huán)。 - configurable: 是否可以刪除屬性或者對屬性描述符進行修改。如果configurable為false,則不能對writable之外的描述符進行修改,同時數(shù)據(jù)屬性和存取器屬性不可轉(zhuǎn)換。也不能將可寫性從false改為true。 數(shù)據(jù)屬性多帶帶有的屬性描述符是: - value:屬性的值。 - writable:屬性的值是否可通過賦值運算符修改。 存取器屬性多帶帶有的屬性描述符是: - set:給屬性提供setter方法,若無則為undefined. - get:給屬性提供getter方法,若無則為undefined. 針對屬性的描述符有以下幾種方法: - `Object.getOwnPropertyDescriptor()` :獲得對象的特定的**自有屬性**的屬性描述符。第一個參數(shù)為對象,第二個為屬性名。 - `Object.defineProperty(obj, prop, descriptor)` :給對象添加新的屬性或者修改已有屬性的屬性描述符,并返回該對象。通過該方法添加的屬性,其默認的屬性描述符都為false.通過賦值運算符設(shè)置的屬性的屬性描述符默認為true. - `Object.defineProperties(obj, props)`:同時修改或添加多個屬性。2.3 對屬性的操作 2.3.1 查詢和設(shè)置
有兩種方式可查詢設(shè)置對象的屬性:.和[]。.的右側(cè)必須是有效標識符且不能是保留字。而[]則可以動態(tài)獲取屬性以及可以轉(zhuǎn)換為字符串的屬性。由于[]訪問與數(shù)組很相似,因此也叫作關(guān)聯(lián)數(shù)組。 屬性的賦值會先檢查原型鏈,若原型鏈有該屬性且該屬性為不可寫,則不能給該屬性賦值。若原型鏈存在且可寫,或者原型鏈不存在該屬性,則該屬性就變?yōu)樽杂袑傩裕也粫薷脑蛯ο蟮膶傩灾怠?2.3.2 刪除屬性
`delete`可刪除對象的自有屬性且configurable為true的屬性。注意:delete只是斷開屬性與對象的關(guān)系,而不是操作屬性中的屬性。由此可能造成內(nèi)存泄漏。2.3.3 檢測屬性
檢測屬性主要檢測兩方面:(1)屬性是否存在在對象中;(2)哪些屬性是自有屬性.提供的方法如下: - `in`操作符。檢測自有和繼承屬性中是否包含該屬性。同時若屬性值為undefined,返回true,若屬性不存在返回false. property in obj - `hasOwnProperty()`: obj.hasOwnProperty("x")檢測屬性”x”是否是obj對象的自有屬性。 - `propertyIsEnumerable()`: obj.propertyIsEnumerable("x")檢測屬性”x”是否是obj對象的自有屬性+該屬性是否可枚舉.當同時為true時才返回true.2.3.4 枚舉屬性
枚舉屬性主要有三種方法: - `for/in`:遍歷所有**可枚舉**的自有+繼承屬性。把屬性名稱賦值給循環(huán)變量。(枚舉+所有) - `Object.keys()`:以**數(shù)組形式**返回對象的所有**可枚舉**的**自有屬性**的名稱。(枚舉+自有) - `Object.getOwnpropertyNames()`:以**數(shù)組形式**返回對象的所有自有屬性。(自有+可枚舉+不可枚舉)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79837.html
摘要:若有函數(shù)名,則在函數(shù)體內(nèi)指代該函數(shù)本身,并且只存在于函數(shù)體中。返回值與普通函數(shù)相同。如果嵌套函數(shù)作為普通函數(shù)調(diào)用,則指向全局對象或者構(gòu)造函數(shù)調(diào)用在函數(shù)或者方法調(diào)用之前使用關(guān)鍵字,則為構(gòu)造函數(shù)調(diào)用。創(chuàng)建一個新的對象繼承構(gòu)造函數(shù)的屬性。 showImg(https://box.worktile.com/view/ddbade8c84bb41cdb20db15228584b8e?pid=4b...
摘要:如果在初學(xué)一門語言的時候第一想到的是問別人,是很難取得進步的。如果你真想學(xué)好,我有個大概的自學(xué)軌跡供你們參考。第一步,學(xué)習(xí)的編程。立即可以嘗試的實例,也可以讓的初學(xué)者馬上看到效果。讀懂別人的代碼是學(xué)習(xí),而改進別人的代碼則是創(chuàng)造了。 javascript入門太容易了,導(dǎo)致幾乎人人隨便看看就能上手,零基礎(chǔ)的人學(xué)個三五天都能對外宣稱自己掌握了js??墒钦嬲莆誮s是一件很難的事情。如果在初學(xué)...
摘要:數(shù)組有以下特點無類型數(shù)組元素可以是任意元素。因此,當小于數(shù)組最大索引時,大于的數(shù)組元素會被刪除。原數(shù)組不會改變將數(shù)組元素轉(zhuǎn)換為字符串并連接在一起。默認將數(shù)組元素用,連接,傳入的參數(shù)即為連接符。 showImg(https://box.worktile.com/view/fcfcdf2c99b14edfb6768085955ae253?pid=4b0845b09ca94218a955f8...
摘要:設(shè)計目的是為了讓在全局范圍內(nèi)有效。在正則表達式后部引用前面的子表達式。傳入分隔符或正則表達式。對象屬性以下屬性返回布爾值。是否包含修飾符以下不返回布爾值整個字符串下一次搜索開始的位置。返回布爾值,若匹配則返回。 1. 正則表達式語法 1.1 表示方法 - `//`字面量模式,`/表達式/修飾符` - 使用`new RegExp(字符串,修飾符 | 正則表達式)`構(gòu)造函數(shù)。 在ES5中,...
摘要:其中負載均衡那一節(jié),基本上是參考的權(quán)威指南負載均衡的內(nèi)容。開發(fā)指南讀了一半,就是看這本書理解了的事件循環(huán)。哈哈創(chuàng)京東一本騙錢的書。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實踐干貨哦~ 本文由騰訊IVWEB團隊 發(fā)表于云+社區(qū)專欄作者:link 2014年一月以來,自己接觸web前端開發(fā)已經(jīng)兩年多了,記錄一下自己前端學(xué)習(xí)路上看過的,以及道聽途說的一些書,基本上按照由淺入深來介紹...
閱讀 3115·2021-10-13 09:40
閱讀 3971·2021-09-22 15:51
閱讀 1512·2021-09-22 15:48
閱讀 1081·2021-09-06 15:00
閱讀 1806·2019-08-30 15:43
閱讀 2372·2019-08-29 18:35
閱讀 1684·2019-08-29 16:18
閱讀 3630·2019-08-29 12:49