不推荐
对象.__proto__ = 别的对象
平静且优雅且推荐
Object.setPrototypeOf(对象, 新的原型对象)
defineProperty
配置一个属性let emp = {} Object.defineProperty(obj, "id", { // 弹出提示快捷键: ctrl+i writable: false, // 是否可写, 用defineProperty添加属性的默认为false enumerable: false, // 是否可遍历 用defineProperty添加属性的默认为false configurable: false, // 是否不可删, 不可修改配置 用defineProperty添加属性的默认为false value: 1, // 对象属性的默认值 }) 写指的是对一个对象赋值如 let o = {name:'jiejie'}
defineProperties
配置多个let emp = {} // 对象名 配置项 Object.defineProperties(emp, { //属性名: 配置项 id: { value: 1001, enumerable: true }, age: { value: 39, writable: true, enumerable: true }, // 语法糖: 在对象内定义方法可以不写 function关键字 intro: { value() { // === function value() {} console.log(this.age, this.name) }, }, })
let emp = {} // 对象名 配置项 Object.defineProperty(emp,"id",{ get(){ return 11111 } })
let emp = {} // 对象名 配置项 Object.defineProperty(emp, "id", { get(){ return "" }, set(val){ console.log("新的值", val) return val } }) return this._id
let emp = {} Object.defineProperty(emp, "_id", { writable:true, }) Object.defineProperty(emp, "id", { get(){ // 在这里不可直接返回 this.id 因为这个也是读操作, 会一直调用这个方法的 return this._id }, set(val){ this._id = val console.log("我是setter方法 我监听到你修改了值", val) return val } })
let emp = {} Object.defineProperties(emp, { _id:{ writable:true }, _name:{ writable:true } }) Object.defineProperties(emp, { id:{ get(){ console.log("我是getter方法 我监听到你读取了值", this._id) return this._id }, set(val){ console.log("我是setter方法 我监听到你读取了值", this._id) this._id = val } }, name:{ get(){ console.log("我是getter方法 我监听到你读取了值", this._name) return this._name }, set(val){ console.log("我是setter方法 我监听到你修改了值", val) this._name = val } }, })
不添加属性: Object.preventExtensions()
"use strict" let emp = { name:"kyle" } Object.preventExtensions(emp) emp.age = 19 // 你可以修改,但不会真正的修改 会被隐藏报错,你可以使用"use strict" 开启严格模式 输出: Uncaught TypeError: Cannot add property age, object is not extensible 不可扩展 at <anonymous>:6:9
不添加或删除属性: Object.seal()
"use strict" let emp = { name:"kyle" } Object.seal(emp) delete emp.name // 你可以修改,但不会真正的修改 会被隐藏报错,你可以使用"use strict" 开启严格模式 输出: Uncaught TypeError: Cannot delete property 'name' of #<Object>
不添加/删除/修改: Object.freeze()
"use strict" let emp = { name:"kyle" } Object.freeze(emp) delete emp.name // 你可以修改,但不会真正的修改 会被隐藏报错,你可以使用"use strict" 开启严格模式 输出: Uncaught TypeError: Cannot delete property 'name' of #<Object>
没有读的限制。