• js中的数据属性与访问器属性


    在javaScript中,对象的属性分为两种类型:数据属性和访问器属性。

     一、数据属性

    数据属性:包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有4个描述其行为的特性:

      1、value:包含该属性的数据值,默认为undefined。

      2、writable:表示能否修改属性的值。

      3、enumerable:表示能否通过for-in循环返回属性。

      4、configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true。

    如下面这个例子:创建一个对象person,打印出name属性的特性的默认值。

    执行结果:

    修改数据属性的默认特性:

      修改数据属性的默认特性要用到一个方法:Object.defineProperty()方法,这个方法有三个参数:属性所在的对象,属性名,一个描述符对象。

    Object.defineProperty(person,'name',{
        writable:false,
        value:"aaa",
        configurable:false,
        enumerable:false
    })

    二、访问器属性

    1、访问器属性:这个属性不包含数据值,包含一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行操作处理的。

    2、访问器属性包含四个特性:

      configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为false。

      enumerable:表示能否通过for-in循环返回属性,默认为false。

      Get:在读取属性时调用的函数,默认为undefined。

      Set:在写入属性时调用的函数,默认为undefined。

    注意:访问器属性不能直接定义,要通过Object.defineProperty()这个方法来定义。

    var book = {
        _year:2020,//下划线表示内部属性,只能通过对象的方法来读写
        editor:2
    }
    console.log(book)
    Object.defineProperty(book,'year',{
        get(){
            return this._year
        },
        //若只指定get不指定set,那就默认该属性是只读的。
        set(newYear){
        if(newYear !== this._year){
            this._year = newYear;
            this.editor++;
            }
        }
    })                    
    console.log(Object.getOwnPropertyDescriptor(book,'year'));    
    console.log("未修改"+book.year);
    book.year = 2018;
    console.log('修改后year的值'+book.year);
    console.log('修改year的值后,editor属性的值:'+book.editor);

    执行结果:

    拓展:

    1、Object.defineProperty() 

    通过Object.defineProperty() 可以直接在对象上创建一个属性,也可以修改已有的属性。

    Object.defineProperty(obj, prop, descriptor) 接收三个参数:

      obj:属性所在的对象  

      prop:要访问的属性名

      descriptor:描述符对象

    描述符对象包含六个属性:configurable、enumerable、writable、value、get、set ,要修改属性的特性,必须使用Object.defineProperty()方法。

    通过以上两种方式添加的对象属性,其布尔值特性默认值是true,通过Object.defineProperty来修改属性特性时,只设置需要修改的特性即可;而通过Object.defineProperty创建的属性,其布尔值特性默认值是false。

    2、Object.defineProperties()

    通过Object.defineProperties()可以一次性为对象定义多个属性。

    var person = {};
    Object.defineProperties(person, {
      name: {
        value: 'Nicy',
        writable: true
      },
      _age: {
        value: 21,
        enumerable: true,
        writable: true,
        configurable: true
      },
      age: {
        get: function() {
        return this._age;
        },
        set: function(value) {
        this._age = value;
        }
      }
    });

    Talk is cheap,show me the code
  • 相关阅读:
    如何将数据库中已有表导入到powerDesigner生成pdm文件
    Delphi TcxTreelist 表格左边总是缩进去 ,好像有偏移 解决方法
    HTML、CSS、JS对unicode字符的不同处理
    老生常谈ajax
    浅谈javascript面向对象
    HTML5原生拖放实例分析
    一个小动画,颠覆你的CSS世界观
    布局神器display:table-cell
    javascript 日常总结
    G2 2.0 更灵活、更强大、更完备的可视化引擎!
  • 原文地址:https://www.cnblogs.com/qc-one/p/12398785.html
Copyright © 2020-2023  润新知