Object.defineProperty方法
Object.defineProperty() (一次添加/修改一个属性)
用法:Object.defineProperty(obj, prop, descriptor)
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
var obj={name:"Jane"} Object.defineProperty(obj,'age',{ value:"16", writable:true, //可重写 enumerable:true, //可枚举 configurable:true //可删除该属性(用到delete) }) //writable:true的时候,obj.age重写可以成功 obj.age=19 for(var i in obj){ console.log(i) } console.log(Object.keys(obj)) //返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性 delete obj.age //configurable:true console.log(obj) //当使用存储性描述的时候,不能用的value和writable //如果不设置方法,则get和set的默认值是undefined var obj={name:"Jane"} var initVal = 16 Object.defineProperty(obj,'age',{ get:function(){ return initVal }, set:function(newVal){ initVal = newVal }, enumerable:true, //可枚举 configurable:true //可删除该属性(用到delete) }) //获取值 console.log(obj.age) //16 //设置值 obj.age=20; console.log(obj.age) //20
var obj={name:'Jane'}
//Object.getOwnPropertyDescriptor方法,可查看属性特性的值 var aa = Object.getOwnPropertyDescriptor(obj,'name') console.log(aa)//{value: "Jane", writable: true, enumerable: true, configurable: true}
通过对象字面量定义的属性,它的数据属性:writable,enumerable,configurable默认为true
而通过Object.defineProperty定义的属性,它的数据属性:writable,enumerable,configurable默认为false
Object.defineProperties() (一次可以添加/修改一个或多个属性)
Object.defineProperties(object, descriptors)
将一个或多个属性添加到对象,并/或修改现有属性的特性。
var obj = {name:'Jack'};
Object.defineProperties(obj, { age:{ //这块同上面的例子,只不过属性名放在了下面 value:18 } })
一次添加多个属性
var obj = Object.defineProperties({}, { age:{ value:18 }, name:{ value:'Jack' }, gender:{ value:'male' } })
Object.setPrototypeOf()方法设置一个指定的对象的原型(即,内部[[Prototype]]属性)到另一个对象或null;
语法:Object.setPrototypeOf(obj,prototype);
obj:要设置其原型的对象
prototype:该对象的新原型(一个对象或者null,如果参数不是一个对象或者null(例如,数字,字符串,boolean,或者undefined),则什么都不做
Object.preventExtensions()
方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
语法:Object.preventExtensions(obj)
参数:obj 将要变得不可扩展的对象;返回值;已经不可扩展的对象;
如果一个对象可以添加新的属性,则这个对象是可扩展的。Object.preventExtensions()将对象标记为不再可扩展,因此
它将永远不会具有超出它标记为不可扩展的属性。注意,一般来说,不可扩展对象的属性可能仍然可被删除。尝试将新属性添加到不可扩展对象将静默失败或抛出异常TypeError(最常见但不排除其他情况,如在strict mode中)
Object.preventExtensions()仅阻止添加自身的属性。但属性仍然可以添加到对象原型中。
一旦使其不可扩展,就无法再对对象进行扩展。
Object.hasOwnProperty()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性,不包括该原型中的属性。