对象

作者: 后发而先制 | 来源:发表于2017-07-25 14:52 被阅读0次

    对象可以通过两种形式定义:声明(文字)形式和构造形式。

    var myObj = { 文字形式。

    key: value

    // ...

    };

    var myObj = new Object(); 构造形式。

    myObj.key = value;

    构造形式和文字形式生成的对象是一样的。唯一的区别是,在文字声明中你可以添加多个键 / 值对,但是在构造形式中你必须逐个添加属性。

    内容

    var myObject = {

    a: 2

    };

    myObject.a; // 2  属性访问

    myObject["a"]; // 2  键访问

    这两种语法的主要区别在于 . 操作符要求属性名满足标识符的命名规范,而 [".."] 语法可以接受任意 UTF-8/Unicode 字符串作为属性名。举例来说,如果要引用名称为 "SuperFun!"的属性,那就必须使用 ["Super-Fun!"] 语法访问,因为 Super-Fun! 并不是一个有效的标识符属性名。

    对象中属性永远是字符串  字面量 。NUMBER OBJECT都不例外。会给转为STRING。数组是数字。区分对象和数组。

    可计算属性名

       健访问派上用场了!

       ES6 增加了可计算属性名,可以在文字形式中使用 [] 包裹一个表达式来当作属性名:

       例如:

    var prefix = "foo";

    var myObject = {

    [prefix + "bar"]:"hello",

    [prefix + "baz"]: "world"

    };

    myObject["foobar"]; // hello

    myObject["foobaz"]; // world

    属性与方法

           属性是个函数,开发者喜欢叫为方法。

    数组

    复制对象

    属性描述符

    var myObject = {

    a:2

    };

    Object.getOwnPropertyDescriptor( myObject, "a" );

    // {

    // value: 2,

    // writable: true,

    // enumerable: true,

    // configurable: true

    // }

    writable(可写)、enumerable(可枚举)和 configurable(可配置)。

      1. Writable

       writable 决定是否可以修改属性的值。

       writable: false, // 不可写! 对对象的属性修改就无效。

      2. Configurable

      只要属性是可配置的,就可以使用 defineProperty(..) 方法来修改属性描述符:

      configurable:false

      把 writable 的状态由 true 改为 false,但是无法由 false 改为 true。

      除了无法修改,configurable:false 还会禁止删除这个属性:

      3. Enumerable

      从名字就可以看出,这个描述符控制的是属性是否会出现在对象的属性枚举中,比如说

      for..in 循环。如果把 enumerable 设置成 false,这个属性就不会出现在枚举中,虽然仍

      然可以正常访问它。相对地,设置成 true 就会让它出现在枚举中。

       用户定义的所有的普通属性默认都是 enumerable,这通常就是你想要的。但是如果你不希

       望某些特殊属性出现在枚举中,那就把它设置成 enumerable:false。

      对象常量

      结合 writable:false 和 configurable:false 就可以创建一个真正的常量属性(不可修改、重定义或者删除):

      禁止扩展

      Object.preventExtensions(..)

      密封

     Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用

     Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false。

     所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以

     修改属性的值)。

       冻结

      Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(..) 并把所有“数据访问”属性标记为 writable:false,     这样就无法修改它们的值。

     Getter和Setter

    相关文章

      网友评论

          本文标题:对象

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