浅谈js中Object.create()与new的具体实现与区别

浅谈js中Object.create()与new的具体实现与区别

Object.create() vs new

在 JavaScript 中,我们可以使用两种方法来创建对象:Object.create() 和 new 关键字。它们的区别如下:

  • 使用 new 关键字创建的对象是一个新的实例,而使用 Object.create() 创建的对象是继承自另一个对象的实例。
  • 使用 new 关键字创建的实例具有一个构造函数,而 Object.create() 创建的实例没有。

Object.create()

Object.create() 方法是ES5引入的一个方法,用于创建一个新的对象,这个对象的原型链指向传入的第一个参数。

语法如下:

Object.create(proto, [propertiesObject])

该方法接收两个参数。

参数 proto 是新对象的原型(必须参数)。传入一个对象,新建对象成为传入对象的原型链上的子代。

参数 propertiesObject 是一个可选的对象,表示为新对象定义新属性时的描述符对象。

示例1:

let person = {
  name: 'Tom',
  age: 18
}

let student = Object.create(person, {
  gender: {
    value: 'male'
  }
})

console.log(student.name)    // Tom
console.log(student.age)     // 18
console.log(student.gender)  // male

在这个示例中,我们创建了一个 person 对象,然后使用 Object.create() 创建了一个新的 student 对象,该对象的原型是 person 对象。所以 student 对象继承了 person 对象的所有属性和方法。

同时,在使用 Object.create() 时,我们还可以传入一个对象,对象中定义的新属性具有属性描述符。

示例2:

let fruit = {
  color: 'red'
}

let apple = Object.create(fruit, {
  name: {
    value: 'apple',
    writable: true,
    enumerable: false,
    configurable: true
  }
})

console.log(apple.name)  // apple
console.log(apple.color) // red

在这个示例中,我们创建了一个 fruit 对象,然后使用 Object.create() 创建了一个新的 apple 对象,该对象的原型是 fruit 对象。在传入的第二个参数中,我们定义了 name 这个新属性,同时对其进行了属性描述符的配置。

new

new 关键字用于调用构造函数来创建一个新对象。构造函数会自动返回一个新建的对象。

语法如下:

let obj = new Constructor([argument0[, argument1[, ...argumentN]]]);

示例:

function Person(name) {
  this.name = name;
}

let person = new Person('Tom');
console.log(person.name);  // Tom

在这个示例中,我们定义了一个 Person 构造函数,并使用 new 关键字创建了一个新对象 person

总结

  • Object.create() 方法创建的对象是继承自另一个对象的实例,而 new 关键字创建的对象是一个新的实例。
  • Object.create() 方法创建的对象没有构造函数,而 new 关键字创建的对象具有构造函数。
  • 在使用 Object.create() 时,可以传入一个对象,该对象用来定义新属性的属性描述符。
  • new 调用的是构造函数,构造函数里面的 this 指向新创建的对象。

希望这篇文章能让你更好地理解 Object.create()new 的区别,并能够更好地使用它们来创建对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈js中Object.create()与new的具体实现与区别 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • JS创建对象常用设计模式工厂构造函数及原型

    JS创建对象常用设计模式有很多种,其中工厂模式、构造函数模式以及原型模式是比较经典的三种。 工厂模式 工厂模式是一种创建对象的模式,通过工厂方法让子类决定具体实现。由于工厂模式中不需要指定创建具体类的类名,因此可以将对象的创建与具体类的实现分离开来,从而降低系统耦合度。在JavaScript中,可以使用对象字面量来实现一个工厂对象,而不需要定义类。 下面是一…

    other 2023年6月26日
    00
  • starccm+11.02安装

    STAR-CCM+ 11.02 安装教程 STAR-CCM+是一款专业的CFD软件,其版本升级比较频繁,这里讲解下星盘CCM+ 11.02的安装。 硬件要求 在安装STAR-CCM+之前,您需要确保系统符合最低硬件要求。- 操作系统:Windows 7/8/10 64位- CPU:双核,2.26 GHz- 内存:2GB以上- 硬盘:至少10GB可用空间- 显…

    其他 2023年3月28日
    00
  • iPad平板怎么释放内存? ipad清理垃圾文件的教程

    iPad平板怎么释放内存?iPad清理垃圾文件的教程 释放内存和清理垃圾文件可以帮助提高iPad平板的性能和运行速度。下面是一些方法和步骤,可以帮助您完成这些任务。 方法一:关闭不必要的应用程序 关闭不必要的应用程序可以释放内存并减少系统资源的使用。以下是关闭应用程序的步骤: 在iPad平板上,双击Home按钮或者使用手势切换到最近使用的应用程序界面。 在最…

    other 2023年8月1日
    00
  • Java 构造器原理及用法解析

    Java 构造器原理及用法解析 构造器简介 在 Java 中,构造器是一种特殊的方法,用于在创建新对象时执行必要的初始化工作。每个类都有一个构造器,如果类没有定义构造器,Java 编译器会默认生成一个无参构造器。构造器使用特殊的语法,即方法名与类名相同,不需要返回值类型声明,不需要使用 void 关键词。 构造器的使用可以分为两个方面:对象实例化和对象初始化…

    other 2023年6月26日
    00
  • Android Studio里如何使用lambda表达式

    下面是详细的攻略。 什么是Lambda表达式 Lambda表达式是Java8中引入的一个新特性,它可以让开发人员更方便的编写函数式接口的实现。Lambda表达式的基本形式为:(parameter) -> expression or statement 这个语法中,parameter表示函数接口的参数列表,->是Java8中新定义的操作符,可以将参…

    other 2023年6月27日
    00
  • 后缀名为.csh是什么文件?

    后缀名为.csh的文件是一种脚本文件,通常用于在Unix和类Unix系统上执行C Shell(csh)脚本。C Shell是一种命令行解释器,它提供了一些与Bourne Shell(sh)不同的语法和功能。 要理解.csh文件的含义,我们可以按照以下步骤进行: 了解C Shell(csh):C Shell是一种Unix Shell,它提供了一种与用户交互的方…

    other 2023年8月5日
    00
  • React Fiber 链表操作及原理示例详解

    React Fiber 是 React 16 中全新的协调引擎,它可以在不阻塞渲染主线程的情况下,执行异步任务。为了实现这一目标,React Fiber 使用链表数据结构来管理组件树的遍历及操作。 React Fiber 的链表包含两个主要的节点类型:FiberNode 和 EffectNode。FiberNode 用于表示当前的组件,而 EffectNod…

    other 2023年6月27日
    00
  • rabbitmq安装与界面管理

    RabbitMQ安装与界面管理 RabbitMQ是一种高性能、可靠的消息队列中间件,被广泛应用于分布式计算、异步通信等领域。本文将介绍RabbitMQ的安装方法和界面管理。 安装RabbitMQ 系统要求 在安装RabbitMQ之前需要确保系统满足以下要求: 支持Erlang/OTP 22版本以上 系统已安装Git、make、gcc等编译环境工具 安装Erl…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部