摘要:枚舉對(duì)象的屬性第二種情況設(shè)置為,可以被枚舉。內(nèi)置對(duì)象訪問器屬性方法介紹摘自方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。對(duì)象中存在的屬性描述符主要有數(shù)據(jù)描述符和訪問器描述符兩種返回傳遞給函數(shù)的對(duì)象參考中的
1. 什么是對(duì)象
對(duì)象是無序?qū)傩缘募?/pre>創(chuàng)建自定義對(duì)象最簡(jiǎn)單的方式就是以字面量的形式創(chuàng)建對(duì)象(或創(chuàng)建一個(gè)Object實(shí)例),然后再為它添加屬性和方法,如下所示:
var person = { name: "Nicholas", age: 29, sayHi: function() { console.log(this.name); } }但是我們需要定義對(duì)象中的某個(gè)屬性能否修改,能夠重寫等屬性,那我們應(yīng)該如何定義
2. 內(nèi)置屬性—數(shù)據(jù)屬性Object.defineProperty()方法介紹(摘自MDN)
Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性,并返回這個(gè)對(duì)象語法:Object.defineProperty(obj, prop, descriptor)
2.1 configurable屬性
參數(shù):
(1)obj:需要被操作的目標(biāo)對(duì)象
(2)prop:目標(biāo)對(duì)象需要定義或修改的屬性的名稱
(3)descriptor:將被定義或修改的屬性的描述符
返回:被傳遞給函數(shù)的對(duì)象是否可以刪除目標(biāo)屬性或是否可以再次修改屬性的特性(writable, configurable, enumerable)。默認(rèn)為false
設(shè)置為true可以被刪除或可以重新設(shè)置特性;
設(shè)置為false,不能被可以被刪除或不可以重新設(shè)置特性,只能將writable從true置為false一旦把屬性定義為不可配置的,就不能再把它便會(huì)可配置的,這一點(diǎn)很重要
主要起到數(shù)據(jù)的保護(hù)作用,決定了目標(biāo)屬性是否可以使用delete刪除,是否可以再次設(shè)置特性
//-----------------測(cè)試目標(biāo)屬性是否能被刪除------------------------ var obj = {} // 第一種情況:configurable設(shè)置為true,可以被刪除。 Object.defineProperty(obj, "newKey", { value: "hello", configurable: true }); // 刪除屬性 delete obj.newKey; console.log( obj.newKey ); //undefined // 第二種情況:configurable設(shè)置為false,不能被刪除。 Object.defineProperty(obj, "newKey", { value: "hello", configurable: false }); // 刪除屬性 delete obj.newKey; console.log( obj.newKey ); //hello //-----------------測(cè)試是否可以再次修改特性------------------------ var obj = {} //第一種情況:configurable設(shè)置為false,不能再次修改特性。 Object.defineProperty(obj, "newKey", { value: "hello", writable: false, enumerable: false, configurable: false }); //重新修改特性 Object.defineProperty(obj, "newKey", { value: "hello", writable: true, enumerable: true, configurable: true }); console.log( obj.newKey ); //報(bào)錯(cuò):Uncaught TypeError: Cannot redefine property: newKey //第二種情況:configurable設(shè)置為true,可以再次修改特性。 Object.defineProperty(obj, "newKey", { value: "hello", writable: false, enumerable: false, configurable: true }); //重新修改特性 Object.defineProperty(obj, "newKey", { value: "hello", writable: true, enumerable: true, configurable: true }); console.log( obj.newKey ); //hello2.2 enumerable 屬性此屬性是否可以被枚舉(使用for...in或Object.keys())默認(rèn)為false
設(shè)置為true可以被枚舉;設(shè)置為false,不能被枚舉
var obj = {} // 第一種情況:enumerable設(shè)置為false,不能被枚舉。 Object.defineProperty(obj, "newKey", { value: "hello", writable: false, enumerable: false }); // 枚舉對(duì)象的屬性 for( var attr in obj ){ console.log( attr ); // undefined } // 第二種情況:enumerable設(shè)置為true,可以被枚舉。 Object.defineProperty(obj, "newKey", { value: "hello", writable: false, enumerable: true }); // 枚舉對(duì)象的屬性 for( var attr in obj ){ console.log( attr ); //newKey }2.3 value 屬性屬性對(duì)應(yīng)的值,可以是任意類型的值,默認(rèn)為undefined;
var obj = {} // 第一種情況:不設(shè)置value屬性 Object.defineProperty(obj, "key", {}); console.log( obj.key ); //undefined // 第二種情況:設(shè)置value屬性 Object.defineProperty(obj, "key", { value: "hello" }); console.log( obj.key ); //hello // 同字面定義的數(shù)據(jù)值對(duì)應(yīng)2.4 writable 屬性屬性的值是否可以被重寫。默認(rèn)為false
設(shè)置為true可以被重寫;設(shè)置為false,不能被重寫
var obj = {} // 第一種情況:writable設(shè)置為false,不能重寫。 Object.defineProperty(obj, "newKey", { value: "hello", writable: false }); // 更改newKey的值 obj.newKey = "change value"; console.log( obj.newKey ); //hello // 第二種情況:writable設(shè)置為true,可以重寫 Object.defineProperty(obj, "newKey", { value: "hello", writable: true }); // 更改newKey的值 obj.newKey = "change value"; console.log( obj.newKey ); //change value2.5 默認(rèn)值理解(重點(diǎn))在調(diào)用 Object.defineProperty 方法給對(duì)象添加屬性時(shí),如果不指定,configurable、enumerable、writable這些值都為默認(rèn)的false
==> 使用 Object.getOwnPropertyDescriptor() 方法來查看對(duì)象的內(nèi)置屬性
var obj = {}; // 第一種情況:使用 Object.defineProperty() 定義屬性 Object.defineProperty(obj, "key", { value: "hello" }); Object.getOwnPropertyDescriptor(obj, "key"); // {value: "hello", writable: false, enumerable: false, configurable: false} // 第二種情況:字面量方式 obj.key = "hello"; Object.getOwnPropertyDescriptor(obj, "key"); // {value: "hello", writable: true, enumerable: true, configurable: true}2.6 數(shù)據(jù)屬性總結(jié)configurable: 目標(biāo)屬性是否可以被刪除或是否可以再次修改特性 true | false
enumerable: 目標(biāo)屬性是否可以被枚舉。true | false
value: 設(shè)置屬性的值 undefined
writable: 值是否可以重寫。true | false
3. 內(nèi)置對(duì)象—訪問器屬性Object.getOwnPropertyDescriptor()方法介紹(摘自MDN)
Object.getOwnPropertyDescriptor() 方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。(自有屬性指的是直接賦予該對(duì)象的屬性,不需要從原型鏈上進(jìn)行查找的屬性)語法:Object.getOwnPropertyDescriptor(obj, prop)
3.1 configurable 屬性
參數(shù):
(1)obj:需要被操作的目標(biāo)對(duì)象
(2)prop:目標(biāo)對(duì)象內(nèi)屬性名稱(String類型)
返回:如果指定的屬性存在于對(duì)象上,則返回其屬性描述符對(duì)象(property descriptor),否則返回 undefined參照數(shù)據(jù)屬性中的configurable屬性
3.2 enumerable 屬性參照數(shù)據(jù)屬性中的enumerable屬性
3.3 get 方法在讀取屬性是調(diào)用的函數(shù),默認(rèn)值為undefined
var obj = {}, value = "hello"; Object.defineProperty(obj, "key", { get: function() { console.log("獲取obj.key的值上下文"); return value; } }); console.log(obj.key); // "獲取obj.key的值上下文" hello obj.key = "new value"; console.log(obj.key); // "獲取obj.key的值上下文" hello3.4 set 方法在寫入屬性時(shí)調(diào)用的函數(shù),默認(rèn)值為undefined
// 一般不會(huì)多帶帶為屬性設(shè)置set而不設(shè)置get var obj = {}, value = "hello"; Object.defineProperty(obj, "key", { set: function(val) { console.log("設(shè)置obj.key的值上下文"); } }); obj.key = "new value"; // "獲取obj.key的值上下文" console.log(obj.key); // undefined不一定非要同時(shí)指定getter和setter。只指定getter意味著屬性是不能寫,嘗試寫入屬性會(huì)被忽略。在嚴(yán)格模式下,嘗試寫入只指定getter函數(shù)的屬性會(huì)拋出錯(cuò)誤。類似的,只指定setter函數(shù)的屬性也不能讀,否則在非嚴(yán)格模式下會(huì)返回undefined,而在嚴(yán)格模式下會(huì)拋出錯(cuò)誤。var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function() { return this._year; }, set: function(newValue) { if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.edition); //2使用訪問器屬性的常見方式,即設(shè)置一個(gè)屬性的值會(huì)導(dǎo)致其他屬性發(fā)生變化
3.5 數(shù)據(jù)和視圖聯(lián)動(dòng)(重點(diǎn))給對(duì)象o定義新的屬性b,并且定義屬性b的get和set方法,當(dāng)o.b的時(shí)候會(huì)調(diào)用b屬性的get方法,給b屬性賦值的時(shí)候,會(huì)調(diào)用set方法,這就是修改數(shù)據(jù)的時(shí)候,視圖會(huì)自動(dòng)更新的關(guān)鍵前端獲取數(shù)據(jù)后,需要根據(jù)數(shù)據(jù)操作dom,視圖變化后,需要修改不少代碼,有沒有方法將數(shù)據(jù)和dom操作隔離,看一個(gè)例子
你好,
// 視圖控制器 var userInfo = {}; Object.defineProperty(userInfo, "nickName", { get: function(){ return document.getElementById("nickName").innerHTML; }, set: function(nick){ document.getElementById("nickName").innerHTML = nick; } }); Object.defineProperty(userInfo, "introduce", { get: function(){ return document.getElementById("introduce").innerHTML; }, set: function(introduce){ document.getElementById("introduce").innerHTML = introduce; } }); // 數(shù)據(jù) // todo 獲取用戶信息的代碼 // .... userInfo.nickName = "xxx"; userInfo.introduce = "我是xxx,我來自云南,..."訪問器屬性是實(shí)現(xiàn)MVVM框架的核心原理哦~
4. 定義多個(gè)屬性Object.defineProperties() 方法直接在一個(gè)對(duì)象上定義新的屬性或修改現(xiàn)有屬性,并返回該對(duì)象語法:Object.defineProperties(obj, props)
參數(shù):
(1)obj:在其上定義或修改屬性的對(duì)象
(2)props:要定義其可枚舉屬性或修改的屬性描述符的對(duì)象。對(duì)象中存在的屬性描述符主要有數(shù)據(jù)描述符和訪問器描述符兩種
返回:傳遞給函數(shù)的對(duì)象var obj = {}; Object.defineProperties(obj, { "property1": { value: true, writable: true }, "property2": { value: "Hello", writable: false } // etc. etc. });參考:
Javascript中的Object.defineProperty
MDN Object.defineProperty
MDN Object.getOwnPropertyDescriptor
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89413.html
摘要:說明此摘要筆記系列是我最近看高級(jí)程序設(shè)計(jì)第版隨手所記。其中,描述符對(duì)象的屬性必須是設(shè)置其中一個(gè)或多個(gè)值,可以修改對(duì)應(yīng)的特性值。如支持的瀏覽器,可以取得指定屬性的描述符。 說明: 此摘要筆記系列是我最近看《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》隨手所記。里面分條列舉了一些我認(rèn)為重要的、需要記下的、對(duì)我有幫助的點(diǎn),是按照我看的順序來的。摘要筆記本身沒有系統(tǒng)性,沒有全面性可言,寫在這里...
摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...
摘要:創(chuàng)建對(duì)象中,創(chuàng)建對(duì)象的基本模式有三種。因此,在設(shè)計(jì)構(gòu)造函數(shù)時(shí),需要進(jìn)行慎重考慮。因此在中,這種問題被稱作繼承破壞封裝。靜態(tài)成員每個(gè)只有一份,直接通過類對(duì)象進(jìn)行訪問。 什么是封裝 找工作時(shí)一些公司給了offer后我就想知道真正拿到手的是多少,畢竟賦稅繁重。但各種稅也好,五險(xiǎn)一金也好我實(shí)在是弄不清楚,于是我就會(huì)在網(wǎng)上的一些稅后收入計(jì)算器上進(jìn)行計(jì)算,只需要填寫一些基本信息,比如稅前收入,所...
摘要:把對(duì)象定義為無序?qū)傩缘募?,其屬性可以包含基本值?duì)象或函數(shù)。接受兩個(gè)參數(shù)屬性所在的對(duì)象和要讀取其特性的屬性名返回的時(shí)其特性的對(duì)象例如讀高級(jí)程序設(shè)計(jì)這本書的第章面向?qū)ο蟮某绦蛟O(shè)計(jì),我做了篇筆記。這是第一篇,后面還有兩篇,分別是封裝類和繼承。 ECMA-262把對(duì)象定義為:無序?qū)傩缘募希鋵傩钥梢园局?、?duì)象或函數(shù)。所以,我們可以理解對(duì)象就是名值對(duì)的集合,名就是對(duì)象的每個(gè)屬性的名字,...
摘要:在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。實(shí)際上,應(yīng)該說是沒有辦法在不影響所有對(duì)象實(shí)例的情況下,給超類型的構(gòu)造函數(shù)傳遞參數(shù)。 面向?qū)ο蟮恼Z言有一個(gè)標(biāo)志,那就是它們都有類的概念,而通過類可以創(chuàng)建任意多個(gè)具有相同屬性和方法的對(duì)象。 理解對(duì)象 創(chuàng)建自定義對(duì)象的最簡(jiǎn)單的方法就是創(chuàng)建一個(gè)Object的實(shí)例,然后再為它添加屬性和方法。例如: var person = new Obje...
閱讀 726·2021-11-15 11:37
閱讀 3347·2021-10-27 14:14
閱讀 6256·2021-09-13 10:30
閱讀 2998·2021-09-04 16:48
閱讀 1962·2021-08-18 10:22
閱讀 2154·2019-08-30 14:19
閱讀 761·2019-08-30 10:54
閱讀 1774·2019-08-29 18:40