美文网首页
理解对象以及属性

理解对象以及属性

作者: QinRenMin | 来源:发表于2018-05-29 16:47 被阅读0次
    • 什么是对象?
      面向对象(Object-Oriented,OO).ECMAScriptt没有类的概念,ECMA262把对象定义为"无序属性的集合,其属性可以包含基本值,对象或者函数",每个对象都是基于一个引用类型创建的.

    • 属性类型
      ECMAScriptt将属性类型分为数据属性和访问器属性

      • 数据属性
        数据属性拥有四个特性:
        writable:设置属性值是否可更改
        configurable:是否能够通过delete删除属性
        enumerable:能否通过for-in循环,以上默认值为true
        value:属性的值
        若要修改属性的默认特性,使用:Object.defineProperty():修接收三个参数,对象名称,属性名称,描述符对象(以上四种)
    
    let person = {
        name : "jane",
        age : 21,
        job : "student",
        say : function () {
            console.log(this.name);
        }
    };
    
    person.say();
    console.log(person.age);
    
    //设置数据属性
    Object.defineProperty( person,"name",{
        writable : false,
        configurable : false,
    
    });
    
    //值不可更改
    console.log(person.name); //jane
    person.name = "gg";
    console.log(person.name); //jane
    
    delete person.name;
    delete person.age;
    console.log(person.name); //jane
    console.log(person.age); //undefined
    
    
    • 访问器属性
      访问器属性不包含数据值
      configurable,enumerable,get,set
      get:读取属性时调用 undefined
      set:写入属性时调用 undefined
      下划线来区别,比如说_name,表示只能通过对象方法访问的属性
    let person = {
        _year:1998,
        grade:80
    };
    
    //定义基本的属性
    Object.defineProperty(person,"_year",{
       value:2000,
       writable:true
    });
    
    //定义访问器属性
    Object.defineProperty(person,"year",{
        get : function(){
            return this._year
        },
        set : function (newValue) {
            this._year = newValue;
            this.grade += newValue - 1997;
        }
    });
    person.year = 1999;
    console.log(person.grade); //82
    console.log(person._year); //1999
    console.log(person.year);  //1999
    
    
    • 将两种属性一起定义
    let book = {};
    
    //同时定义两个属性
    Object.defineProperties(book,{
    
        _price :{
          value:24,
            writable:true
        },
    
        name : {
           writable:false,
           value:"你也走了很远的路吧"
       }
    
    });
    
    book.price = 30;
    console.log(book._price); //30
    console.log(book.price); //30
    
    • 读取属性的特性
    /*
    读取属性的特性
    Object.getOwnPropertyDescriptor()
    接收两个参数:属性所在的对象以及属性名称
    * */
    let ddd = Object.getOwnPropertyDescriptor(person,"grade");
    console.log(ddd.enumerable);//tue
    console.log(ddd.writable);//tue
    console.log(ddd.configurable);//tue
    
    let descrip = Object.getOwnPropertyDescriptor(book,"_price");
    console.log(descrip.value);//30
    console.log(descrip.writable);//true
    console.log(descrip.enumerable);//false
    console.log(descrip.configurable);//false
    console.log(descrip.get);//undefined
    
    let de = Object.getOwnPropertyDescriptor(book,"price");
    console.log(de.enumerable); //false
    console.log(de.value);//undefined
    console.log(de.get);//[Function: get]
    

    相关文章

      网友评论

          本文标题:理解对象以及属性

          本文链接:https://www.haomeiwen.com/subject/pasajftx.html