JavaScript点滴积累之Object.defineProperty用法(错误A property cannot both have accessors and be writable or have a value)

Object.defineProperty(obj, prop, descriptor):给对象定义属性,或者修改对象的属性,并且返回该对象。对象接收三个参数:对象,属性名,属性描述(限定)。

1.descriptor参数必须是一个对象类型,并且属性可以分为三类(必须,数据,可访问性),分别如下:

必须类: 

  configurable:属性是否可以改变,或删除 默认false

  enumerable:能否for in 默认false

数据类:  

  value:直接设置属性值

  writable:是否可以修改

可访问性:

  get:通过function设置属性值

  set:通过function改变值

注意:(value writable)和(get set)不能同时出现。否则就会出现这样的一句错误:

JavaScript点滴积累之Object.defineProperty用法(错误A property cannot both have accessors and be writable or have a value)_第1张图片

2.两种等效的写法(属性可读可写):

        var owner=document.getElementById('div1');
        Object.defineProperty(owner,'1',{
            writable:true,
            value:'Hello1'
        });

        var hello2='Hello2';
        Object.defineProperty(owner,'2',{
            get:function(){return hello2},
            set:function(data){hello2=data;}
        });

        alert(owner['1']);//Hello1
        owner['1']='World1';
        alert(owner['1']);//World1

        alert(owner['2']);//Hello2
        owner['2']='World2';
        alert(owner['2']);//World2

3.构建只读属性,针对属性的限制在descriptor参数里面进行设置。代码实现如下:

        //first
        var owner=document.getElementById('div1');
        Object.defineProperty(owner,'1',{
            writable:false,
            value:'Hello1'
        });

        alert(owner['1']);//Hello1
        owner['1']='World1';
        alert(owner['1']);//Hello1

        //second
        var val;
        Object.defineProperty(owner,'2',{
            get:function(){return 'Hello2';}
        });

        alert(owner['2']);//Hello2
        owner['2']='World2';
        alert(owner['2']);//Hello2

4.提一个问题,这个问题一般不会出现,那就是能不能定义一个只能写不能读的属性?(纯属YY)

  首先通过第一种方式来尝试实现:  

        //first
        var owner=document.getElementById('div1');
        Object.defineProperty(owner,'1',{
            writable:true
        });

        alert(owner['1']);//undefined
        owner['1']='World1';
        alert(owner['1']);//World1 说明通过该方式不能实现

  尝试第二种:

        //second
        var val='Hello2';
        Object.defineProperty(owner,'2',{
            set:function(data){val=data;}
        });

        alert(owner['2']);//undefined
        owner['2']='World2';
        alert(owner['2']);//undefined 说明的确是一个不能读的,只能写的~~

写这篇博客的目的主要是遇到了题目中的错误,索性就搞清楚下Object.defineProperty用法。希望对大家帮助!

 

你可能感兴趣的:(JavaScript点滴积累之Object.defineProperty用法(错误A property cannot both have accessors and be writable or have a value))