@a11d/is-writable
检查一个对象属性是否可写出, 记录属性描述符、 获取符/ 发送符以及原型链 .
import '@a11d/is-writable'
const obj = { name: 'John' }
Object.defineProperty(obj, 'id', { value: 123, writable: false })
Object.isWritable(obj, 'name') // true
Object.isWritable(obj, 'id') // false
安装
npm install @a11d/is-writable
API 密码
Object.isWritable(object, key): boolean ——检查一个属性是否可以写入
回返 true 如果财产是可写入的, false 否则.
const obj = {}
Object.defineProperty(obj, 'readonly', { value: 42, writable: false })
Object.isWritable(obj, 'readonly') // false
Object.isWritable(obj, 'newProp') // true (non-existent properties are writable)
检查整个原型链 :
class Base {
get value() { return 1 }
}
class Child extends Base {}
Object.isWritable(new Child(), 'value') // false (getter-only in prototype)
行为
被冻结的对象
回返 false 对于被冻结物体上的所有属性:
const obj = { name: 'John' }
Object.freeze(obj)
Object.isWritable(obj, 'name') // false
Object.isWritable(obj, 'newProp') // false
获取器和设置器
只获取属性不可写 :
const obj = {
get value() { return 42 }
}
Object.isWritable(obj, 'value') // false
既包含获取器又包含设定器的属性可写 :
const obj = {
get value() { return this._value },
set value(v) { this._value = v }
}
Object.isWritable(obj, 'value') // true
仅保存属性可写 :
const obj = {
set value(v) { console.log(v) }
}
Object.isWritable(obj, 'value') // true
不存在属性
不存在的属性被视为可写( 除非对象被冻结) :
const obj = {}
Object.isWritable(obj, 'newProp') // true
原型链
检查原型链中的所有描述符 :
class Base {
get value() { return 1 }
}
class Child extends Base {
get value() { return 2 }
set value(v) { /* add setter alongside getter */ }
}
Object.isWritable(new Base(), 'value') // false (getter-only)
Object.isWritable(new Child(), 'value') // true (has both getter and setter)
出口
| 名称 | 仁爱 |
|---|---|
isWritable | 函数 |