欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript对象属性的特性高级功能

程序员文章站 2022-03-09 08:56:48
...

“use strict”
/创建一个对象最简单的方式:创建一个Object的实例,然后再为它添加属性和方法/
var person = new Object();
person.name = “Hongbin”;
person.age = 21;
person.job = “students”;
person.say = function () {
console.log("Hi! I am "+this.name);
};
//后来 对象字面量 成为创建这种对象的首选模式。用对象字面量语法写上述代码:
var person = {
name:“Hongbin”,
age:21,
job:“students”,
say:function () {
console.log("Hi! I am "+this.name)
}
};
//对象有数据属性,数据属性有4个描述其行为的特性(特性是内布置,按照ECMA-262规范,要把它们放入两对方括号中[[xxx]])
/*
* [[Configurable]]:能否删除属性,能否修改属性的特性,能否把属性修改为访问器属性,像上述对象的属性Configurable默认为true
*
* [[Enumerable]]:能否通过for-in循环返回属性,像上述例子默认为true
*
* [[Writable]]:表示能否修改属性的值。向上面可以直接给属性值,该属性就为true
*
* [[Value]]:包含这个属性的数据值。读取数据值的时候,从这个位置读;写入属性值时,把新值保存在这个位置,默认为undefined;例如上述name:“Hongbin”,"Hongbin"就是name属性的值就是[[Value]],没有给他值就是undefined;
*
* 要使用它们,即要修改属性默认特性必须使用ECMAScript5的Object.defineProperty()方法,该方法要传三个参数:(属性所在的对象,属性的名字,描述符对象)。描述符对象即configurable,enumerable,writable,value。可以同时设置多个特性,将第三个参数传一个{xxx:xxx,xxx:xxx}进去即可,要注意的是使用该方法后不声明configurable,enumerable,writable特性默认都为false。
* */
//举个例子:
var dog = {};//创建一个小狗对象
Object.defineProperty(dog,“name”,{
value:“xiaoxiaobin”,//设置小狗的名字为xxx
writable:false//name属性的值是只读的,不可以被修改,如果对name赋值,在非严格模式下,会被忽略,在严格模式下会抛出错误。
});
console.log(dog);
dog.name = “tiger”;
JavaScript对象属性的特性高级功能
JavaScript对象属性的特性高级功能
JavaScript对象属性的特性高级功能

JavaScript对象属性的特性高级功能

<script>
    //"use strict";
    /*创建一个对象最简单的方式:创建一个Object的实例,然后再为它添加属性和方法*/
    var person = new Object();
    person.name = "Hongbin";
    person.age = 21;
    person.job = "students";
    person.say = function () {
        console.log("Hi! I am "+this.name);
    };
    //后来 对象字面量 成为创建这种对象的首选模式。用对象字面量语法写上述代码:
    var person = {
        name:"Hongbin",
        age:21,
        job:"students",

        say:function () {
            console.log("Hi! I am "+this.name)
        }
    };
    //对象有数据属性,数据属性有4个描述其行为的特性(特性是内布置,按照ECMA-262规范,要把它们放入两对方括号中[[xxx]])
    /*
    * [[Configurable]]:能否删除属性,能否修改属性的特性,能否把属性修改为访问器属性,像上述对象的属性Configurable默认为true
    *
    * [[Enumerable]]:能否通过for-in循环返回属性,像上述例子默认为true
    *
    * [[Writable]]:表示能否修改属性的值。向上面可以直接给属性值,该属性就为true
    *
    * [[Value]]:包含这个属性的数据值。读取数据值的时候,从这个位置读;写入属性值时,把新值保存在这个位置,默认为undefined;例如上述name:"Hongbin","Hongbin"就是name属性的值就是[[Value]],没有给他值就是undefined;
    *
    * 要使用它们,即要修改属性默认特性必须使用ECMAScript5的Object.defineProperty()方法,该方法要传三个参数:(属性所在的对象,属性的名字,描述符对象)。描述符对象即configurable,enumerable,writable,value。可以同时设置多个特性,将第三个参数传一个{xxx:xxx,xxx:xxx}进去即可,要注意的是使用该方法后不声明configurable,enumerable,writable特性默认都为false。
    * */
    //举个例子:
    var dog = {};//创建一个小狗对象
    Object.defineProperty(dog,"name",{
        value:"xiaoxiaobin",//设置小狗的名字为xxx
        writable:false//name属性的值是只读的,不可以被修改,如果对name赋值,在非严格模式下,会被忽略,在严格模式下会抛出错误。
        ,configurable:true//设置name属性为可删除
    });

    // dog.name = "tiger";//无法修改,严格模式下报错
    Object.defineProperty(dog,"age",{
        value:2,//age:2
        configurable:false//该属性不能从对象中删除,严格模式下删除抛出错误
    });

    // delete dog.age;
    delete dog.name;
    console.log(dog);

</script>

多数形况下可能没必要用到Object.defineProperty()方法提供的这些高级功能。不过作为了解还是好的,可以加深对JavaScript对象的概念理解。