『壹』 js通過Object.defineProperty()定義和控制對象屬性
Object.defineProperty()用於定義或修改對象的屬性,並返回該對象,實際上即使不定義變數接收返回值,該對象也會被直接修改。它接受三個參數:要定義屬性的對象、屬性名或Symbol,以及一個描述該屬性的對象,稱為屬性描述符。屬性描述符可以分為數據屬性描述符和存取屬性描述符,兩者共有的key是configurable和enumerable。
configurable描述屬性是否可以刪除,例如:
const obj = { singer: 'Jay' }
Object.defineProperty(obj, 'singer', { configurable: false })
delete obj.singer
當將singer的configurable設置為false時,在嚴格模式下刪除singer屬性會報錯。描述屬性是否可以被重新定義,例如:
const obj = { singer: 'Jay' }
Object.defineProperty(obj, 'age', { configurable: false })
Object.defineProperty(obj, 'age', { enumerable: false })
設置age的configurable為false後,試圖再次修改其enumerable特性也會報錯。描述屬性是否可以修改,例如:
const obj = { singer: 'Jay' }
Object.defineProperty(obj, 'singer', { configurable: false })
Object.defineProperty(obj, 'singer', { get() { return 'Zhou' } })
將singer的配置改為false後,試圖將其配置為存取屬性描述符會報錯。enumerable描述屬性是否可枚舉,例如:
const obj = { singer: 'Jay' }
Object.defineProperty(obj, 'age', { enumerable: false })
使用for in遍歷obj時,只能得到singer而得不到age。使用Object.keys()遍歷得到的數組也只包含singer。writable描述屬性值是否可修改,例如:
const obj = { singer: 'Jay' }
Object.defineProperty(obj, 'singer', { writable: false })
obj.singer = 10
在嚴格模式下,給writable為false的屬性賦值會報錯。value為屬性的值,當屬性被獲取時返回該值,修改屬性時則修改該值。get當屬性被獲取時執行getter函數,set當屬性被設置時執行setter函數。定義一個存取描述符屬性,例如:
const obj = { singer: 'Jay', _age: 40 }
Object.defineProperty(obj, 'age', { get() { return this._age }, set(value) { this._age = value } })
console.log(obj.age) // 40
obj.age = 50
console.log(obj.age) // 50
使用存取描述符定義的屬性,直接列印查看對象時,會發現其結果為{ singer: Jay, _age: 40, age: [Getter/Setter] }。通過Object.getOwnPropertyDescriptor()和Object.getOwnPropertyDescriptors()可以查看屬性描述符。定義多個屬性可以使用Object.defineProperties(),它接受兩個參數,第一個參數是對象,第二個參數是一個對象,鍵名為要定義的屬性,值為屬性描述符。
每個對象本身都可以直接使用getter和setter來定義屬性,例如:
const obj = { firstName: 'Jay', lastName: 'Zhou', get fullName() { return this.firstName + ' ' + this.lastName }, set fullName(val) { const tempArr = val.split(' ') this.firstName = tempArr[0] this.lastName = tempArr[1] }}
到此關於js通過Object.defineProperty()定義和控制對象屬性的文章介紹結束,更多相關內容請繼續瀏覽自由互聯。
『貳』 keycloak自定義主題
Keycloak自定義主題是通過一系列步驟對Keycloak前端頁面進行個性化設置的過程。
具體步驟包括:
創建主題文件夾:首先,在Keycloak安裝目錄下的themes路徑下,新建一個文件夾,該文件夾的名稱即為你想要創建的新主題的名稱。
創建頁面文件夾:在新建的主題文件夾內,根據需求創建Login(登錄表單,包含注冊)、Account(賬戶管理)、Admin(管理控制台)和Email(郵件)這四類頁面的文件夾。例如,如果你想要設計登錄頁面,就創建一個login文件夾。
配置theme.properties文件:在對應的頁面文件夾(如login)下,創建theme.properties文件。這個文件用於配置主題信息,如繼承自哪個主題、導入哪些資源等。這是自定義主題的關鍵步驟之一。
添加資源文件:在對應的頁面文件夾下的resources文件夾中,存放CSS、JS、img等文件。這些文件用於自定義頁面的樣式、行為和圖片等,使頁面符合你的設計需求。
自定義文本內容:如果需要自定義登錄頁面上的文本,可以在對應的頁面文件夾下創建messages文件夾,並在其中創建消息文件(如messages_zh_CN.properties)。這個文件用於定義中文等語言的文本內容,使頁面文本更加符合你的需求。
設置並重啟服務:完成以上配置後,需要在Keycloak的管理控制台中將登錄主題設置為新創建的主題。然後,重啟Keycloak服務以使更改生效。這樣,用戶就可以看到自定義後的登錄頁面等前端頁面了。
通過自定義主題,Keycloak的登錄頁面等前端頁面可以更加符合企業的UI風格和品牌調性,從而提升品牌形象和用戶體驗。
『叄』 gradle.properties文件在哪
通常在項目的根目錄,在Android Studio 創建一個項目的時候,根目錄下會生成gradle.properties和local.properties文件。
properties的數據格式:
採用鍵值對的方式,寫法:key=value
(3)js解析properties文件擴展閱讀
項目結構
1、app/build:app模塊編譯輸出的文件。
2、app/libs: 放置引用的類庫文件。
3、app/src: 放置應用的主要文件目錄。
4、app/src/androidTest:單元測試目錄。
5、app/src/main:主要的項目目錄和代碼。
6、app/src/main/assets:放置原生文件,裡面的文件會保留原有格式,文件的讀取需要通過流。
7、app/src/main/java:項目的源代碼。
8、build:系統生成的文件目錄。
9、gradle: wrapper的jar和配置文件所在的位置。
10、.gitattributes:用於設置文件的對比方式。
11、.gitignore: 忽略的文件或者目錄。
12、build.gradle:項目的gradle編譯文件。
13、gradle.properties: gradle相關的全局屬性設置。
14、gradlew: 編譯腳本,可以在命令行執行打包。
15、gradlew.bat:windows下的gradle wrapper可執行文件。
16、local.properties:配置SDK/NDK所在的路徑。
17、MyApplication.iml:保存該模塊的相關信息。
18、README.md:文本編輯器,記錄一些相關信息。
19、settings.gradle:設置相關的gradle腳本。
20、External Libraries:項目依賴的庫,編譯時自動下載。
『肆』 JS中attr和prop屬性的區別
JS中attr和prop屬性的區別如下:
1、attr是attribute的縮寫,是一個特性節點,每個DOM元素都有一個對應的attributes屬性來存放所有的attribute節點,attributes是一個類數組的容器,說得准確點就是NameNodeMap,總之就是一個類似數組但又和數組不太一樣的容器。attributes的每個數字索引以名值對(name=」value」)的形式存放了一個attribute節點。
<div class="box" id="box" gameid="880">hello</div>
上面的div元素的HTML代碼中有class、id還有自定義的gameid,這些特性都存放在attributes中,類似下面的形式:
[ class="box", id="box", gameid="880" ]
可以這樣來訪問attribute節點:
var elem = document.getElementById( 'box' );
console.log( elem.attributes[0].name ); // class
console.log( elem.attributes[0].value ); // box
2、與之對應的property屬性,比較特殊的是一些值為Boolean類型的property,如一些表單元素:
<input type="radio" checked="checked" id="raido">
var radio = document.getElementById( 'radio' );
console.log( radio.getAttribute('checked') ); // checked
console.log( radio.checked ); // true
對於這些特殊的attribute節點,只有存在該節點,對應的property的值就為true,如:
<input type="radio" checked="anything" id="raido">
var radio = document.getElementById( 'radio' );
console.log( radio.getAttribute('checked') ); // anything
console.log( radio.checked ); // true
3、了更好的區分attribute和property,基本可以總結為attribute節點都是在HTML代碼中可見的,而property只是一個普通的名值對屬性。