JavaScript对象

1.理解对象

1.1 对象的定义

方法一:创建Object的一个新的实例,然后再给它添加属性和方法

   let person1 = new Object();
    person1.name = "cai";
    person1.sex = "女";

方法二:使用字面量创建

   let person2 = {
        "name": "wang",
        "sex": "女",
        5: true,
        "age": 15,
    };

1.2 属性的类型

属性分为两种:数据属性访问器属性

1.数据属性

数据属性包含一个保存数据值的位置,值会从这个位置读取,也会写入到这个位置。数据属性有四个特性描述它们的行为

特性 描述
Configurable 表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下值为true
Enumberable 表示是否可以通过for-in循环返回。默认情况下,所有直接定义在对象上的这个特性都是true
Writable 表示属性的值是否可以修改。默认值为true
Value 包含属性实际的值。默认值为undefined

Object.defineProperty()方法用于修改默认特性。

例子:

    let person = {};
    Object.defineProperty(person, "name", {
        writable: false,
        configurable: false,
        value: 'caicai'
    });
    console.log(person.name); //caicai
    person.name = "wangwang";
    console.log(person.name); //caicai
    delete person.name;
    console.log(person.name); //caicai
2.访问器属性

访问器属性不含数据值。相反,它们包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必须的。

在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值。在写入访问器属性是,会调用设置函数并传入新值,这个函数必须决定对数据做出什么修改。它也有四个特性描述它们的行为:

特性 描述
Configurable 表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性。默认值为true
Enumerable 表示属性是否可以通过for-in循环访问。默认值为true
Get 获取函数,在读取属性时调用。默认值为undefined
Set 设置函数,在写入属性时调用。默认值为undefined

例子:

    let book = {
        year_: 2017,
        edition: 1
    };
    Object.defineProperty(book, "year", {
        get() {
            return this.year_;
        },
        set(value) {
            if (value > 2017) {
                this.year_ = value;
                this.edition += value - 2017;
            }
        }
    });
    book.year = 2018;
    console.log(book.edition);//2
3.定义多个属性

定义多个属性使用方法Object.defineProperties()方法

 //定义多个属性
    let bookA = {};
    Object.defineProperties(bookA, {
        year_: {
            value: 2017
        },
        edition: {
            value: 1
        },
        year: {
            get: function() {
                return this.year_;
            },
            set: function(value) {
                if (value > 2017) {
                    this.year_ = value;
                    this.edition += value - 2017;
                }
            }
        }
    });
4.读取属性的特性

使用方法Object.getOwnPropertyDescriptor()可以取得指定属性的属性描述符。这个方法接收两个参数:属性所在的对象和要取得其描述符的属性名。

ECMAScript2017新增了Object.getOwnPropertyDescriptors()静态方法,这个方法实际上会在每个自有属性上调用Object.defineProperties()并在一个新对象中返回它们。

例子:

 //读取属性的特性
    let desc = Object.getOwnPropertyDescriptor(bookA, "year_");
    console.log(desc.value);
    console.log(desc.configurable);
    console.log(typeof desc.get);
    let desc1 = Object.getOwnPropertyDescriptor(bookA, "year");
    console.log(desc1.value);
    console.log(desc1.enumerable);
    console.log(typeof desc1.get);
    let desc2 = Object.getOwnPropertyDescriptors(bookA);
    console.log(desc2);
5.合并对象

ECMAScript6专门为合并对象提供了Object.assign()方法。

这个方法接收一个目标对象和一个多源对象作为参数,然后将每个源对象中可枚举自有属性赋值到目标对象。以字符串和符号为键的属性会被复制。对每个符合条件的属性,这个方法会使用源对象上的[[Get]]取得属性的值,然后使用目标对象的[[Set]]设置属性的值。

例子:

    let desc3 = {};
    let src = {
        id: "src"
    };
    let resultA = Object.assign(desc3, src);
    console.log(desc3 === resultA); //true
    console.log(desc3 !== src); //true
    console.log(resultA); //{id: 'src'}
    console.log(desc3); //{id: 'src'}
    //多个源对象
    let result, dest;
    dest = {};
    result = Object.assign(dest, {
        a: "a"
    }, {
        b: "b"
    });
    console.log(result);
    // assgin覆盖相同属性 (代码略)

Object.assign()实际上对每个源对象执行的是浅复制

6.对象标识以及相等判断

方式一:===操作符

方式二:Object.is()方法 ,一些特殊情况可使用该方法判断,如:要确定NaN的相等性,使用NaN===NaN会返回false,在ES6之前只能使用isNaN(),ES6之后就可以使用Object.is(),Object.is(NaN,NaN)返回true。

     //对象标识以及相等判断
    //===操作符;
    console.log(true === 1);
    console.log({} === {});
    console.log("2" === 2);
    //Object.is();
    console.log(Object.is(true, 1));
    console.log(Object.is({}, {}));
    console.log(Object.is("2", 2));
7.增强对象的语法

参考书籍:《JavaScript程序设计》第4版 Matt Frisbie

版权声明:本文为caiiac原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/caiiac/p/16536078.html