『壹』 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只是一个普通的名值对属性。