`Object.create()` 方法的参数

简介: 【10月更文挑战第29天】`Object.create()` 方法的参数提供了多种创建对象和控制对象属性及继承关系的方式,开发人员可以根据具体的需求灵活运用,以实现更高效、更符合设计要求的对象创建和继承机制。

Object.create() 方法用于创建一个新对象,它接受一个参数,该参数有多种形式和用途

传入对象作为原型

  • 基本用法:最常见的用法是传入一个对象作为参数,这个对象将成为新创建对象的原型。新创建的对象会继承原型对象的所有可枚举属性和方法。例如:
var protoObj = {
   
  name: 'Proto',
  sayHello: function() {
   
    console.log('Hello, I am ' + this.name);
  }
};

var newObj = Object.create(protoObj);
newObj.name = 'New';
newObj.sayHello();

在上述示例中,newObj 对象继承了 protoObjname 属性和 sayHello 方法,当调用 newObj.sayHello() 时,会输出 Hello, I am New

  • 原型链继承:通过这种方式,可以轻松实现原型链继承。可以创建一个包含通用属性和方法的原型对象,然后使用 Object.create() 创建多个继承自该原型的对象,从而实现代码的复用和对象之间的继承关系。例如:
var animalProto = {
   
  type: 'Animal',
  eat: function() {
   
    console.log('I am eating.');
  }
};

var dog = Object.create(animalProto);
dog.type = 'Dog';
dog.bark = function() {
   
    console.log('Woof!');
  };

var cat = Object.create(animalProto);
cat.type = 'Cat';
cat.meow = function() {
   
    console.log('Meow!');
  };

dog.eat(); 
dog.bark(); 
cat.eat(); 
cat.meow();

在这个示例中,dogcat 对象都继承了 animalPrototype 属性和 eat 方法,同时各自又添加了自己特有的方法,实现了基于原型链的继承。

传入 null

  • 当传入 null 作为 Object.create() 的参数时,会创建一个没有原型的对象。这样的对象不会继承任何属性和方法,完全独立于其他对象的原型链之外。例如:
var nullProtoObj = Object.create(null);
nullProtoObj.name = 'No Proto';
console.log(nullProtoObj.hasOwnProperty('name'));

在上述示例中,nullProtoObj 没有原型,所以它只有自身定义的 name 属性,调用 hasOwnProperty() 方法可以验证该属性是对象自身的属性,而不是从原型继承来的。这种创建无原型对象的方式在一些特殊场景下可能有用,例如需要创建一个纯粹的数据对象,不希望有任何来自原型的干扰。

传入非对象参数

  • 如果传入的参数不是对象类型(如数字、字符串、布尔值等),JavaScript会尝试将其转换为对象。对于基本数据类型,会先将其包装为对应的包装对象类型。例如,传入一个字符串作为参数:
var strProtoObj = Object.create('string');
console.log(strProtoObj);

在上述示例中,字符串 'string' 会被转换为对应的字符串包装对象 String('string'),然后作为新对象的原型。但需要注意的是,这种用法通常不符合常规的编程实践,因为基本数据类型的包装对象本身并不是用于作为对象的原型,可能会导致一些意外的行为和结果。

传入对象的属性描述符

  • 除了直接传入一个对象作为原型外,还可以传入一个包含属性描述符的对象来更精细地控制新创建对象的属性。属性描述符是一个对象,用于描述属性的各种特性,如可枚举性、可写性、可配置性等。例如:
var descriptorObj = {
   
  name: {
   
    value: 'Descriptor',
    writable: false,
    enumerable: true,
    configurable: true
  },
  age: {
   
    value: 25,
    writable: true,
    enumerable: false,
    configurable: false
  }
};

var descObj = Object.create({
   }, descriptorObj);
console.log(descObj.name); 
descObj.name = 'New Name';
console.log(descObj.name); 
console.log(descObj.age); 
descObj.age = 30;
console.log(descObj.age);

在上述示例中,通过属性描述符对象 descriptorObj 定义了 nameage 两个属性的特性。name 属性是不可写的,所以尝试修改它的值不会生效;age 属性是不可配置的,所以不能使用 delete 操作符删除它。这种方式可以更精确地控制对象属性的行为和访问限制,在需要严格限制对象属性的读写和配置时非常有用。

Object.create() 方法的参数提供了多种创建对象和控制对象属性及继承关系的方式,开发人员可以根据具体的需求灵活运用,以实现更高效、更符合设计要求的对象创建和继承机制。

相关文章
|
8月前
|
缓存 监控 前端开发
前端静态资源加载优化
本文系统讲解前端静态资源加载优化,涵盖资源压缩、缓存策略、CDN加速、懒加载、预加载、HTTP/2升级等十大核心维度,结合Webpack配置与实战案例,助力开发者提升页面性能,打造极致用户体验。
581 0
|
移动开发 前端开发 UED
Webpack的DllPlugin和DLLReferencePlugin应用
介绍使用 DllPlugin和DLLReferencePlugin 的应用
Webpack的DllPlugin和DLLReferencePlugin应用
|
前端开发
react18【系列实用教程】Hooks 闭包陷阱 (2024最新版)含useState 闭包陷阱,useEffect 闭包陷阱,useCallback 闭包陷阱
react18【系列实用教程】Hooks 闭包陷阱 (2024最新版)含useState 闭包陷阱,useEffect 闭包陷阱,useCallback 闭包陷阱
411 0
|
搜索推荐 算法 JavaScript
JavaScript实现的7种排序算法
JavaScript实现的7种排序算法
521 0
|
算法 安全 前端开发
基于postMessage和BroadcastChannel实现浏览器跨Tab窗口通信的方法介绍
基于postMessage和BroadcastChannel实现浏览器跨Tab窗口通信的方法介绍
808 1
|
JavaScript
【报错】onMounted is called when there is no active component instance too be associated with.
【报错】onMounted is called when there is no active component instance too be associated with.
1549 4
|
存储 算法 调度
《计算机操作系统》重点知识笔记整理(二)
《计算机操作系统》重点知识笔记整理(二)
466 0
|
SQL NoSQL Oracle
萌新妹纸不会写后端代码,还不是照样开发API速度贼快
萌新妹纸不会写后端代码,还不是照样开发API速度贼快
921 0
|
6月前
|
人工智能 算法 安全
Gemini 3 Deep Think 升级:Codeforces 3455 分,科研级推理能力全面开放
Gemini 3 Deep Think 是Google DeepMind推出的高推理模式AI,在ARC-AGI-2达84.6%、Codeforces获3455 Elo(全球前10),并逼近数理化奥赛金牌水平。它专注科研级推理、工程建模与成本优化,标志AI从“解题”迈向“协同科研”。
|
7月前
|
存储 缓存 测试技术
阿里云 u1 实例(ecs.u1-c1m2.large)性能测评、收费标准、实例规格及注意事项
阿里云 u1 实例(ecs.u1-c1m2.large)性能测评,以2核4G的阿里云u1实例(ecs.u1-c1m2.large)为例,阿里云u1实例中的2核4G规格(ecs.u1-c1m2.large),可选1M-3M固定带宽,是面向轻量业务的通用算力型配置——2核CPU能应对基础并行计算需求,4G内存适配中小型应用运行,1M-3M固定带宽可满足不同访问量的对外服务场景,适合个人开发者、小微企业搭建官网、运行轻量应用或测试环境。下面从价格构成、性能表现、适用场景三方面,用通俗语言拆解这款实例。
603 9