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 : 用于检测某个对象,是否出现在某个实例对象的原型链上