Javascript Object.create 用法详解

举报
林欣 发表于 2024/11/25 11:37:05 2024/11/25
【摘要】 在 JavaScript 中,Object.create() 是一个静态方法,它创建一个新对象,使用现有的对象来提供新创建的对象的 __proto__。换句话说,它允许你创建一个对象,该对象继承自另一个对象的属性和方法。 Object.create 详解 语法Object.create(proto[, propertiesObject])proto:新创建对象的原型对象。properties...

在 JavaScript 中,Object.create() 是一个静态方法,它创建一个新对象,使用现有的对象来提供新创建的对象的 __proto__。换句话说,它允许你创建一个对象,该对象继承自另一个对象的属性和方法。

Object.create 详解

语法

Object.create(proto[, propertiesObject])
  • proto:新创建对象的原型对象。
  • propertiesObject(可选):可选属性描述符,这些属性描述符将被添加到新创建的对象中。

返回值

一个新对象,其原型(即内部 [[Prototype]] 属性)由参数 proto 提供。如果参数 proto 不是对象或者为 null,则新创建的对象将不会有原型(即它将不会继承任何属性和方法)。在 ES5 规范中,如果参数 protoundefinednull,则新对象的原型会被设置为 Object.prototype 的原型,但这是一个已废弃的行为,并且在 ES6 及以后的版本中,如果 protonullundefined,将会抛出一个 TypeError

特性

  • 原型继承Object.create() 允许你创建一个对象,该对象继承自指定的原型对象。
  • 属性定义:通过第二个参数,你可以在新对象上定义属性,并指定这些属性的特性(如可枚举性、可配置性、可写性等)。
  • 减少全局命名空间污染:使用 Object.create() 而不是直接通过字面量创建对象,可以减少全局命名空间中的对象数量,因为你可以创建一个具有特定原型的对象,而不需要将属性添加到全局对象(如 Object.prototype)上。

示例

// 创建一个原型对象
const person = {
  isHuman: false,
  printIntroduction: function() {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  }
};

// 创建一个新对象,其原型是 person
const me = Object.create(person);

// "name" 和 "isHuman" 是 me 的属性
me.name = 'John'; // "name" 是 me 的属性,而不是 person 的属性
me.isHuman = true; // 改变 me 的 isHuman 属性,不会影响到 person

me.printIntroduction();
// 输出: "My name is John. Am I human? true"

// 由于 person 没有 "name" 属性,所以访问 person.name 会返回 undefined
console.log(person.name); // 输出: undefined

在这个例子中,me 是通过 Object.create(person) 创建的,它继承了 person 的属性和方法。但是,me 有自己的 nameisHuman 属性,这些属性与 person 的属性是分开的。

使用属性描述符

你还可以使用属性描述符来定义新对象的属性:

const newPerson = Object.create(person, {
  name: {
    value: 'Jane',
    writable: false,
    enumerable: true,
    configurable: true
  }
});

console.log(newPerson.name); // 输出: Jane
newPerson.name = 'Doe'; // 尝试修改 name 属性,但由于 writable: false,所以这里会静默失败(严格模式下会抛出错误)
console.log(newPerson.name); // 仍然输出: Jane

在这个例子中,newPersonname 属性被设置为不可写(writable: false),因此尝试修改它的值会失败。

注意事项

  • 使用 Object.create() 时,请确保提供的原型对象(proto)是有效的对象,否则将会抛出 TypeError
  • 在 ES5 及以后的版本中,Object.create() 是创建具有指定原型的新对象的标准方法。在 ES5 之前,你需要使用其他方法(如构造函数或 __proto__ 属性)来实现类似的功能。
  • 当你使用 Object.create() 创建对象时,请考虑属性的可枚举性、可配置性和可写性,以确保你的对象符合预期的行为。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。