2

认识Object.defineProperty以及Object.defineProperties

Object.defineProperty会直接在对象上定义新的属性和方法,或者修改存在的属性和方法,并返回这个对象。

语法:

Object.defineProperty(object, propertyname, descriptor)

参数:

  1. object 必需。添加需要修改属性或者添加属性的对象。
  2. propertyname 必需。需要定义或者修改属性的名称(字符串)。
  3. descriptor 必需。属性描述符。通俗说,属性的描述。可以添加数据(数据描述符)属性,或者访问器(存取描述符)属性。数据描述符与存取描述符不可混用,否则报错。后续详解。

descriptor的参数

数据描述符

  1. value-----属性的值,默认为 undefined。
  2. writable-----属性是否可写,当属性的值可以被赋值操作修改时设置为true。默认为false。

访问器描述符

  1. get-----属性的getter方法,属性如果有getter方法,则返回属性值,否则返回undefined。默认为 undefined。
  2. set-----属性的setter方法,属性如果没有setter方法,返回undefined。该方法接收唯一的参数,作为属性的新值。默认为 undefined。

实例

实现input输入,span同时输出功能

<body>
    <input type="text">
    <span></span>
</body>
<script>
    var input = document.querySelector("input");
    var span = document.querySelector("span");
    //创建新对象
    var obj = {};
    //getValue只是自己定义的属性名字
    Object.defineProperty(obj,"getValue",{
        //configurable-----如果为false,
        //则任何尝试删除目标属性或修改属性以下
        //特性(writable, configurable, enumerable)的行为将被无效化。
        configurable:true,
        //传入参数并把参数赋值
        set:function(Data){
            input.value = Data;
            span.innerHTML = Data;
        }
    })
    //input标签设置键盘弹起事件
    input.onkeyup = function(){
        //赋值,实现数据双向开始。
        obj.getValue = input.value;
    }
</script>

运行结果

clipboard.png
注意

  1. 当使用了getter或setter方法,不允许使用writable和value这两个属性。
  2. get或set不是必须成对出现,任写其一就可以。如果不设置方法,则get和set的默认值为undefined

Object.defineProperties使用

语法

Object.defineProperties(obj, props)

使用实例

两个input标签之间数据互传

<body>
    <div>
        输入数据
        <input type="text" class="one">
    </div>
    <div>
        显示数据
        <input class="tow"></input>
    </div>
</body>
<script>
    var one = document.querySelector('.one');
    var tow = document.querySelector('.tow');
    //创建新对象
    var obj = {};
    //使用对象的方法保存属性的名字
    Object.defineProperties(obj, {
        onediv: {
            //ture表示允许删除属性或者修改属性
            configurable: true,
            //传入参数并把参数赋值
            set: function (newValue) {
                one.value = newValue;
                tow.value = newValue;
            }
        },
        towdiv: {
            //ture表示允许删除属性或者修改属性
            configurable: true,
            //传入参数并把参数赋值
            set: function (newValue) {
                one.value = newValue;
                tow.value = newValue;
            }
        }
    })
    //input标签设置键盘弹起事件
    one.onkeyup = function(){
        //赋值,实现数据双向开始。
        obj.onediv = one.value;
    }
    //input标签设置键盘弹起事件
    tow.onkeyup = function(){
        //赋值,实现数据双向开始。
        obj.towdiv = tow.value;
    }
</script>

运行结果

clipboard.png


sherlock成
1 声望2 粉丝