本篇文章為大家帶來了關於javascript的相關知識,其中主要介紹了關於物件導向的相關問題,包括了屬性描述符、資料描述符、訪問描述符等等內容,下面一起來看一下,希望對大家有幫助。
【相關推薦:javascript影片教學、web前端】
JavaScript物件導向-屬性描述符
JavaScript其實支出多種程式設計範式的,包括函數式程式設計和物件導向程式設計:
- JavaScript中的物件被設計成一組屬性的無序集合,像是嘻哈表,有key和value組成;
- key是一個識別符名稱,value可以是任意類型,也可以是其他物件或函數型別;
- 如果值是函數,那麼我們可以稱為物件的方法;
1、如何建立一個物件呢?
- 早起使用創建物件方式最多的是使用Object類,並且使用new關鍵字來創建一個物件,然後再將屬性或方法存入物件中:
var obj = new Object() obj.name = 'why' console.log(obj.name, obj) // why { name: 'why' }
- 後來很多開發者為了方便起見,都是直接透過字面量的形式來建立物件:
// 字面量方式 var obj2 = { name: 'jam', age: '8' } console.log(obj) // { name: 'jam', age: '8' }
2、操作物件的屬性-屬性描述符
在之前我們的屬性都是直接定義在物件內部,或是直接加入物件內部;
但是這樣我們就不能對這個屬性做一些限制:例如這個屬性是否可以透過delect
刪除,是否可以在for-in
遍歷的時候被遍歷出來呢?
如果我們想要對一個屬性進行比較精準的操作控制,那麼我就可以使用 屬性描述子。透過屬性描述符可以精確的新增或修改物件的屬性;
屬性描述子需要使用 Object.defineProperty
來對屬性進行新增或修改。
屬性描述符分為兩種:資料描述符和存取描述符
#2.1資料描述符
#資料描述符是一個具有值的屬性,該值可能是可寫的,也可能是不可寫的。資料描述符具有以下可選鍵值:
- value:此屬性對應的值。可以是任何有效的JavaScript值(數值,對象,函數等)。預設為undefined。
- writable:當且僅當該屬性的writable為true時,value才能被複製運算子改變。預設為false。
- configurable:當且僅當該屬性的configurable為true時,此屬性描述子才能夠被改變,同時該屬性也能從對應的物件上刪除。預設為false。
- enumerable:當且僅當該屬性的enumerable為true時,此屬性才能夠出現在物件的列舉屬性中。預設為false。
2.2.1、取得屬性描述子Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()方法傳回指定物件上一個自有屬性對應的屬性描述符。
Object.getOwnPropertyDescriptor(obj,prop)
- obj:需要尋找的目標物件
- prop:目標物件內屬性名稱(String類型)。
- 傳回值:如果指定的屬性存在在於物件上,則傳回其屬性描述符對象,否則傳回undefined。
注意:如果該方法的第一個參數不是對象,會報錯(TypeError)。
2.1.2、設定屬性描述子Object.defineProperty
#Object.defineProperty() 方法會直接在一個物件上定義一個新屬性,或者修改一個物件的現有屬性, 並傳回這個物件。
Object.defineProperty(obj,prop,descriptor)
- obj:要在其上定義屬性的物件。
- prop:要定義或修改的屬性的名稱。
- descriptor:將被定義或修改的屬性描述符
- #:被傳遞給函數的物件
如下示例代码展示了属性描述符的设置和获取 var obj = { name: 'jam', age: 8 } Object.defineProperty(obj, 'job', { value: '律师' }) console.log(Object.getOwnPropertyDescriptor(obj, 'age')) // { value: 8, writable: true, enumerable: true, configurable: true } console.log(obj.job) // 律师 // 通过defineProperty新增的属性,该新属性是不可修改、不可删除以及不可枚举的 console.log(Object.getOwnPropertyDescriptor(obj, 'job')) // {value: '律师',writable: false,enumerable: false,configurable: false}
注意:透過defineProperty新增的屬性,該新屬性是不可修改、不可刪除以及不可列舉的
#(1)configurable在物件上是否可刪除
var obj = { name: 'jam', age: 8 } Object.defineProperty(obj, 'address', { value: '河北', // configurable 该属性不可删除,更不可再次使用defineProperty修改属性描述符 configurable: false, }) delete obj.address // 想使用delete删除该属性 obj.address = '广州' // 想修改obj中的属性address值为广州 console.log(obj.address) // 输出结果:河北
因為屬性描述符configurable值為false 不可刪除和修改,所以delete和修改都沒生效
(2)enumerable 是否可列舉遍歷
var obj = { name: 'jam', age: 8}Object.defineProperty(obj, 'sex ', { value: '男', // enumerable 配置该属性是否可以枚举 enumerable: true})for (i in obj) { console.log(i)}
當enumerable: false時,輸出結果為name age
當enumerable: true時,輸出結果為name age sex
#(3)writable 此特性控制該屬性是否可以賦值(寫入值)
var obj = { name: 'jam', age: 8}Object.defineProperty(obj, 'score', { value: 80, // writable: true writable: false})obj.score = 100 console.log(obj.score) // 80
因為writeable的值為false,所以修改score為100時,並沒有修改成功,最終輸出80
2.1.3、同时设置多个属性描述符 Object.defineProperties
是不是感觉每次只能设置一个属性的属性描述符很繁琐,Object.defineProperties可以帮你解决问题。
Object.defineProperties()方法为对象定义一个或多个新属性或修改现有属性,并返回该对象。
Object.defineProperties(obj,props)
- obj:要在其上定义属性的对象。
- props:要定义其可枚举属性或修改的属性描述符的对象。
- 返回值:被传递给函数的对象。
示例代码如下:
var obj = { name: 'jam',}Object.defineProperties(obj, { 'age': { value: 28, writable: true, configurable: false, enumerable: true }, 'job': { value: '律师', writable: true, configurable: false, enumerable: true }, 'sex': { value: '男', writable: false, configurable: false, enumerable: true }, 'height': { value: '1.8 m', writable: false, configurable: false, enumerable: true }})console.log(obj) // name: 'jam', age: 28, job: '律师', sex: '男', height: '1.8m' }
2.2存取描述符
存取描述符是由getter-setter函数对描述的属性。存取描述符具有以下可选键值:
- get:给属性提供getter的方法,如果没有getter则为undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象。
- set:给属性提供setter的方法,如果没有setter则为undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
- configurable:当且仅当该属性的configurable为true时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为false。
- enurnerable:当且仅当该属性的enurnerable为true时,该属性才能够出现在对象的枚举属性中。默认为false。
configurable 和 enurnerable 的使用与数据描述符中的一致,这里就不过多讲解了。
主要讲一下get 和 set 方法的使用
2.2.1 get()与set()的使用
var obj = { name: 'jam', age: 8, _address: '河北' } // 存取描述符的使用场景 // 1.隐藏某一个私有属性被希望直接被外界使用和赋值 // 2.如果我们希望解惑某一个属性它访问和设置值的过程时,也会使用存储属性描述符 Object.defineProperty(obj, 'address', { enumerable: true, configurable: true, get: function () { foo() return this._address }, set: function (value) { bar() this._address = value } }) function foo () { console.log("截获了一次address的值") } function bar () { console.log("设置了一次address的值") }
上述示例代码控制台打印结果如下:
【相关推荐:javascript视频教程、web前端】
以上是JavaScript物件導向詳細解析之屬性描述符的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具