三种方式创建对象的几种方式及new实例化时做了什么?

创建对象的几种方式

  1. 利用对象字面量创建对象
javascript 复制代码
const obj = {}

2.利用 new Object创建对象

javascript 复制代码
 const obj = new Object()

3.使用 构造函数实例化对象

javascript 复制代码
function Fn(name) {
    this.name = name
  }
const obj = new Fn('张三')
console.log(obj.name); //张三

为什么要用构造函数的形式?

有同学可能会问:我们用对象字面量创建对象不是很方面快捷吗,为啥会出现构造函数这种繁琐的创建方式呢?

因为第1,2种方式只比较适用于我们需要创建少量对象时,而如果我们要创建很多个对象,且每个对象的属性有很多属性相同时,我们再用对象字面量去创建对象的话,就会显得代码很冗余了。如:

而我们使用构造函数创建的话,只需这样:

javascript 复制代码
function Fn(name, age, gender) {
    this.name = name
    this.age = age
    this.gender = gender
  }
  const peiqi = new Fn('佩奇', 6, '女')
  const qiaozi = new Fn('乔治', 3, '男')
  const mon = new Fn('猪妈妈', 26, '女')
  const dad = new Fn('猪爸爸', 28, '男')

实例化对象时的new到底做了什么呢?

  1. 创建一个空对象
  2. 设置原型链: 把空对象的__proto__属性指向构造函数的prototype对象
  3. 执行构造函数:并进入构造函数Fn中执行操作,把this指向新创建的对象
  4. 返回对象(如果构造器没有手动返回对象,则返回第一步的对象)
javascript 复制代码
function Fn(name, age, gender) {
    this.name = name
    this.age = age
    this.gender = gender
  }
 // 模拟new实例化过程
 function myNew(constructorFn, ...args) {
    const obj = {}
    obj.__proto__ = constructorFn.prototype
    const result = constructorFn.apply(obj, args)
    return typeof result === 'object' ? result : obj
  }
  const cat = new myNew(Fn, '机器猫', 28, '男')

为什么要执行第二点,即设置原理链

是为了共享构造函数原型中的属性和方法: obj.proto = constructorFn.prototype

javascript 复制代码
function Fn(name, age, gender) {
    this.name = name
    this.age = age
    this.gender = gender
  }
  Fn.prototype.say = function () {
    console.log('sayHi');
  }
  function myNew(constructorFn, ...args) {
    const obj = {}
    //这样实例化出来的对象就可以使用原型对象中的属性和方法啦
    obj.__proto__ = constructorFn.prototype
    const result = constructorFn.apply(obj, args)
    return typeof result === 'object' ? result : obj
  }
  const cat = new myNew(Fn, '机器猫', 28, '男')

原型链总结

  • 每个构造函数 都有一个prototype属性,该属性指向原型对象,原型对象 用来给各个实例化对象共享属性和方法。
  • 每个实例化对象都有一个__proto__属性,该属性也指向原型对象。
相关推荐
汤米粥2 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾5 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺11 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
马剑威(威哥爱编程)36 分钟前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
奔跑草-1 小时前
【前端】深入浅出 - TypeScript 的详细讲解
前端·javascript·react.js·typescript
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
yyqzjw1 小时前
【qt】控件篇(Enable|geometry)
开发语言·qt
csdn_kike1 小时前
QT Unknown module(s) in QT 以及maintenance tool的更详细用法(qt6.6.0)
开发语言·qt