高级JS-对象的增强

53 阅读1分钟

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象

/*
*obj要定义属性的对象
* prop要定义或修改的属性的名称或 Symbol
* descriptor要定义或修改的属性描述符 
* */
var obj = {
    // 默认 configurable:true
    name:'www',
    age:19
}
Object.defineProperty(obj,prop,descriptor)

// 同时定义多个属性
Object.defineProperties(obj,{
    name:{
        configurable:false,
        writable:false
    },
    age:{
        writable:false
    }
})
  • 数据属性描述符
var obj = {
    // 默认 configurable:true
    name:'www',
    age:19
}
Object.defineProperty(obj,'name',{
    configurable:false, // 告诉js引擎,obj对象的name属性不可删除,默认false
    enumerable:false, // 不可通过for-in或者Object.keys()返回该属性,默认false
    writable:false, //只读属性,默认false
    value:name // 属性的value值,读取属性时会返回该值,默认是undefined
})
Object.defineProperty(obj,'address',{
    // 默认 configurable:false
})
  • 存取属性描述符
var obj = {
    name:'www'
}
var _name = ''
Object.defineProperty(obj,'name',{
    set:function (value) {
        console.log('set方法被调用了','设置的值:',value);
        _name = value
    },
    get:function () {
        console.log('get方法被调用了');
        return _name
    }
})
// 存值
obj.name = 'wqq' // set方法被调用了 设置的值: wqq
obj.name = 'qqq' // set方法被调用了 设置的值: qqq
// 取值
console.log(obj.name); // qqq
  • 对象的方法补充

hasOwnProperty: 对象是否有某一个属于自己的属性(不是在原型上的属性)

function createObject(o) {
    function F() {}
    F.prototype = o
    return new F()
}

var obj = {
    name: 'ww',
    age: 10
}

var info = createObject(obj)
info.message = '吃点香菜'
console.log(info.hasOwnProperty('name')); // false
console.log(info.hasOwnProperty('message')); // true

in/for in : 判断某个属性是否在某个对象或者对象的原型上

instanceof : 用于检测构造函数的pototype,是否出现在某个实例对象的原型链上

isPrototypeOf : 用于检测某个对象,是否出现在某个实例对象的原型链上