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()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性,不包括该原型中的属性。

 

posted @ 2018-03-28 10:47  伊优  阅读(321)  评论(0编辑  收藏  举报