object的方法详解

发布时间:2023-05-21

一、Object.create()

Object.create() 方法可以用于创建一个新对象,新对象的原型指向指定对象。具体来说,该方法接收参数:Object.create(proto, [propertiesObject]),其中 proto 表示新对象的原型,propertiesObject 表示对象的属性,是可选参数。 示例代码:

    const parent = {
      name: "Parent",
      printName() {
        console.log(this.name);
      }
    };
    const child = Object.create(parent);
    child.name = "Child";
    child.printName(); // Child

上述示例中,通过 Object.create() 方法创建了一个新对象 childchild 的原型指向 parent。子对象可以覆盖父对象的属性和方法,如代码中的 name 属性。通过 child.printName() 方法调用,输出的是 child 对象的 name 属性。

二、Object.defineProperty()

Object.defineProperty() 方法可以用于在对象上定义一个新属性或修改已有属性的特性。具体来说,该方法接收参数:Object.defineProperty(obj, prop, descriptor),其中 obj 表示要定义属性的对象,prop 表示要定义的属性名,descriptor 表示属性的描述符,是一个对象。 示例代码:

    const obj = {};
    Object.defineProperty(obj, "name", {
      value: "Alice",
      writable: false,
      enumerable: true,
      configurable: true
    });
    console.log(obj.name);      // Alice
    obj.name = "Bob";   // 尝试修改name属性
    console.log(obj.name);      // Alice,因为writable为false

上述示例中,通过 Object.defineProperty() 方法在 obj 对象上定义了一个 name 属性,value 表示属性值为 "Alice",writable 表示属性不可修改(即只读),enumerable 表示属性可枚举,configurable 表示属性可被删除或重新设置特性。

三、Object.defineProperties()

Object.defineProperties() 方法与 Object.defineProperty() 类似,但可以定义多个属性。具体来说,该方法接收参数:Object.defineProperties(obj, props),其中 obj 表示要定义属性的对象,props 表示要定义的属性,是一个对象。 示例代码:

    const obj = {};
    Object.defineProperties(obj, {
      name: {
        value: "Alice",
        writable: false,
        enumerable: true,
        configurable: true
      },
      age: {
        value: 25,
        writable: true,
        enumerable: true,
        configurable: true
      }
    });
    console.log(obj.name);  // Alice
    obj.name = "Bob";  // 尝试修改name属性
    console.log(obj.name);  // Alice,因为writable为false
    console.log(obj.age);   // 25
    obj.age = 30;    // 尝试修改age属性
    console.log(obj.age);   // 30,由于writable为true,属性可以修改

上述示例中,通过 Object.defineProperties() 方法在 obj 对象上一次性定义了两个属性 nameagename 属性是只读的,age 属性是可读写的。

四、Object.getOwnPropertyDescriptors()

Object.getOwnPropertyDescriptors() 方法可以获取一个对象的所有自身属性的描述符。具体来说,该方法接收参数:Object.getOwnPropertyDescriptors(obj),其中 obj 表示要获取属性描述符的对象。 示例代码:

    const obj = {
      name: {
        value: "Alice",
        writable: false
      },
      age: {
        value: 25,
        writable: true
      }
    };
    const descriptors = Object.getOwnPropertyDescriptors(obj);
    console.log(descriptors);

上述示例中,通过 Object.getOwnPropertyDescriptors() 方法获取了 obj 对象的所有自身属性的描述符,并将结果输出到控制台。

五、Object.freeze()

Object.freeze() 方法可以冻结一个对象,使其属性不可修改、删除或添加。具体来说,该方法接收参数:Object.freeze(obj),其中 obj 表示要冻结的对象。 示例代码:

    const obj = {
      name: "Alice",
      age: 25
    };
    Object.freeze(obj);
    obj.name = "Bob";    // 尝试修改name属性
    obj.gender = "female";  // 尝试添加gender属性
    delete obj.age;      // 尝试删除age属性
    console.log(obj);    // 输出{ name: 'Alice', age: 25 }

上述示例中,通过 Object.freeze() 方法冻结了 obj 对象,使其属性不可修改、删除或添加。尝试修改、添加或删除对象的属性均会被忽略。