We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Object.defineProperty(obj, prop, descriptor)
configurable 当且仅当该属性的configurable为true时,该属性描述才能被改变,同时该属性也能从对应的对象上被删除。 默认为false。
true
enumerable 当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。
value 该属性对应的值。默认为 undefined。
writable 当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为 false。
get 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。默认:undefined。
set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。默认:undefined。
var obj1 = {}; Object.defineProperty(obj1, 'name', { value: 'zhangsan', writable: true // 属性值是否可以改变 }) obj1.name = 'lisi' console.log(obj1)// 'lisi'
var obj2_1 = {}; Object.defineProperty(obj2_1, "FAVORITE_NUMBER", { value: 42, writable: false, configurable: false }); console.log(obj2_1.FAVORITE_NUMBER)// 42
使用Object.preventExtensions(..)禁止属性扩展
var obj2_2 = { name: 'zhangsan' }; Object.preventExtensions(obj2_2);// 禁止扩展 // 仍然可以进行修改属性 Object.defineProperty(obj2_2, 'name', { value: 'lisi' }) console.log(obj2_2.name)// 'lisi' // 不能扩展属性 obj2_2.sex = 'man';// Uncaught TypeError: Cannot add property sex, object is not extensible console.log(obj2_2.sex);
Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用 Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false。
var obj2_3 = { name: 'zhangsan' } Object.seal(obj2_3);// 密封 // 不能扩展属性 obj2_3.sex = 'man'; console.log(obj2_3.sex)// undefined Object.defineProperty(obj2_3, 'name', {// Uncaught TypeError: Cannot redefine property: name at Function.defineProperty value: 'lisi', configurable: true })
密封之后不仅不能添加新属性,也不能修改或是删除任何现有属性。
Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用 Object.seal(..) 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们 的值。
var myObject = {}; Object.defineProperty(myObject, 'a', { value: 1, enumerable: true// 属性可枚举 }) Object.defineProperty(myObject, 'b', { value: 2, enumerable: false// 属性不可枚举 }) console.log(Object.keys(myObject))// ['a']
参考:《你不知道的JavaScript(上卷)》
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Object.defineProperty语法
数据描述符和存取描述符均具有以下可选键值:
configurable
当且仅当该属性的configurable为
true
时,该属性描述才能被改变,同时该属性也能从对应的对象上被删除。 默认为false。enumerable
当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false。
数据描述符具有以下可选键值:
value
该属性对应的值。默认为 undefined。
writable
当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为 false。
存取描述符具有以下可选键值:
get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。默认:undefined。
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。默认:undefined。
Object.defineProperty使用场景
1、 对象定义属性和赋值
2、根据“不变性”,有以下4种使用场景
1)定义对象常量
2)禁止扩展
使用Object.preventExtensions(..)禁止属性扩展
3)密封
Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用 Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false。
密封之后不仅不能添加新属性,也不能修改或是删除任何现有属性。
4)冻结
Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用 Object.seal(..) 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们 的值。
3、根据“存在性”,区分对象属性是否可枚举
参考:《你不知道的JavaScript(上卷)》
The text was updated successfully, but these errors were encountered: