美文网首页学习笔记
数值属性和访问器属性

数值属性和访问器属性

作者: 一个人夜里安静的发呆 | 来源:发表于2018-02-23 16:05 被阅读0次

    'use strict'

    //方法1:创建一个实例,再给它赋属性和方法

    var person =new Object();

    person.name="Jiaweiyuan";

    person.age=23;

    person.job="student";

    person.sayName=function(){

    console.log("name:"+this.name);

    };

    // 方法2:对象字面量

    var person1={

    name:"Zhouquan",

    age:23,

    job:"student",

    sayName:function(){

    console.log("name:"+this.name);

    }

    };

    /*6.1.1 属性*/

    /*1.数据属性:*/

    //  [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性或者把属性修改成访问器属性。新定义的对象默认值是true

    //  [[Enumerable]]:表示能否通过for-in循环返回属性,新定义的对象默认值为true

    //  [[Writable]]:表示能否修改属性的值,新定义对象默认值为true

    //  [[Value]]:包含这个属性的数据值,写入/读取数据值的时候,都从这个位置写入/读取

    // ES5才出现的,描述了内部特征,不能直接访问,是为了实现javascript的引擎用的,放在两对儿方括号中、

    var person2={

    name:"Quanshushu"

    };

    //[[Value]]特性被设置为"Quanshushu",这个值若修改都会被反应在这个位置

    /**/

    //ES5的Object.defineProperty()方法用来修改属性的默认特性

    //Object.defineProperty('属性所在的对象','属性的名字','描述符对象')

    Object.defineProperty(person2,"name",{

    writable:false,

    enumerable:false

    });

    try{

    person2.name="Zhoudeng";

    //因为[[Writable]]特性值被修改成false,所以name属性没有被修改

    //严格模式下,以上操作会报错

    }catch(e){

    // console.log(e.message);

    }

    /**/

    // 关于[[Configurable]]特性有以下注意

    try{

    Object.defineProperty(person1,"name",{configurable:false});

    delete person1.name;//result:"Cannot delete..."

    }catch(e){

    // console.log(e.message);

    }

    try{

    Object.defineProperty(person1,"name",{configurable:false});

    // Object.defineProperty(person1,"name",{configurable:true});//error,一旦把属性定义为不可配置的就不能重新定义为可配置的了

    Object.defineProperty(person1,"name",{writable:true});//[[Configurable]]特性被设置为false之后,只有[[writable]]特性可以更改

    person1.name="asd";

    // console.log(person1.name);//result:"asd"

    }catch(e){

    console.log(e.message);

    }

    /**/

    /*2.访问器属性:*/

    //不包含数据值,包含一对儿getter和setter函数(但都不是必须的)

    var salary={

    _data:2350,//前面的下划线是一种记号,用于表示只能通过对象方法访问的属性

    grade:"普通员工",

    };

    /*支持此方法的浏览器:IE9+,FF4+,SF5+,O12+,Chrome*/

    Object.defineProperty(salary,"data",{

    get:function(){

    return this.data;

    }

    ,

    set:function(newValue){

    if(newValue>=2350&&newValue<8950){

    this._data=newValue;

    this.grade="初级工程师";

    }

    else if(newValue>=8950&&newValue<18950){

    this._data=newValue;

    this.grade="中级工程师";

    }

    else if(newValue>=18950&&newValue<28950){

    this._data=newValue;

    this.grade="高级工程师";

    }

    else{

    this._data=newValue;

    this.grade="其他职位";

    }

    }

    });

    try{

    salary.data=15400;

    console.log(JSON.stringify(salary));

    }catch(e){

    // console.log(e.message)

    }

    //使用访问器属性的常见方式,即设置一个属性的值会导致其他属性发生变化

    //只设置setter函数或者只设置getter函数在strict模式下会导致错误

    //旧浏览器访问方法:

    // 请注意,该方法是非标准的,不要尝试用它

    var book={

    _year:2004,

    edition:1

    }

    book.__defineGetter__("year",function(){

    return this._year;

    });

    book.__defineSetter__("year",function(newValue){

    if(newValue>2004){

    this._year=newValue;

    this.edition+=newValue-2004;

    }

    });

    book.year=2005;

    // console.log(book.edition);

    // 定义多个属性的Object.defineProperties()方法

    相关文章

      网友评论

        本文标题:数值属性和访问器属性

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