当前位置: 首页 > news >正文

【js(7)创建对象的三种写法】

创建对象的三种写法

  • 一、new操作符
    • 1.实现原理
    • 2.模拟new操作符的实现
  • 二、字面量
  • 三、Object.create
    • 1.实现步骤
    • 2.模拟实现
    • 3.Object.create()和new的区别

一、new操作符

在这里插入图片描述

1.实现原理

  • 创建了一个空对象,
  • 将空对象的原型,指向于构造函数的原型
  • 将空对象作为构造函数的上下文(改变this指向)
  • 对构造函数有返回值的处理判断(如果是值类型,返回创建的对象。如果是引用类型,就返回这个引用类型的对象。)
        function Foo() {this.name = 'yang';return 111;//--->Foo {name :'yang'} 返回的是值类型忽略return [1, 2, 3];// --->[1,2,3]  返回的是引用类型,new不起作用}console.log(new Foo());//console.log(Foo.prototype = new Foo().__proto__);//true

2.模拟new操作符的实现

        function Fun(age, name) {this.name = name;this.age = age;}//模拟new操作符function create(fn, ...args) {//...args为参数数组//1.创建一个空对象var obj = {};//2.将空对象的原型指向构造函数的原型Object.setPrototypeOf(obj, fn.prototype);//3.将空对象作为构造函数上下文(改变this指向)//调用构造函数fn,并将this指向obj,将参数args传给fn//result为函数执行完的值(构造函数的返回值)var result = fn.apply(obj, args);console.log(result);//4.对构造函数返回值进行处理判断return result instanceof Object ? result : obj;}console.log(create(Fun, "Tom", 20));

二、字面量

const obj = {key1: value1,key2: value2,method() {// 方法体}
};//举例:
const person = {name: "Alice",age: 25,greet() {console.log("Hello, my name is " + this.name);}
};person.greet(); // 输出: Hello, my name is Alice

三、Object.create

  • Object.create()方法也是创建一个新的对象,使用传入的现有对象作为新建对象的__proto__属性的引用
var Parent = {name:"Zong"
};
let child = Object.create(Parent);
console.log(child.name)//Zong
//这里的"Zong"其实不是child自带的name属性,而是child顺着原型链找到的,child.__proto__ => Parent

1.实现步骤

  • 创建一个空的构造函数F
  • F的prototype对象指向传入对象的__proto__
  • new一个F的实例并返回

2.模拟实现

Object.create = function(proto){let F = function() {};F.prototype = proto;return new F();
}

3.Object.create()和new的区别

  • ​ Object.creat()创建一个新的实例对象,该实例的实例原型指向Object.create()接收的参数本身
  • new 构造函数(),这个操作创建一个新的实例对象,该实例的实例原型指向构造函数的prototype
        var Parent = function () {this.name = "Zong"}var Parent2 = {name: "zong"};let child1 = new Parent();let child2 = Object.create(Parent);//传的是一个函数,而不是一个普通对象console.log(child2.__proto__ === Parent);//truelet child3 = Object.create(Parent2);console.log(child1);//Parent {name: "Zong"}console.log(child2);//Function {}console.log(child3);//{},这里返回了一个空对象(没有自身属性的对象)//但这个对象的__proto__.name为"zong"(可以访问Parent2上的属性)
  • 如果 Base 是一个构造函数(function),采用这种方法创建对象没有意义(只是让新对象的原型指向了构造函数本身)
  • 如果 Base 是一个实例对象或者字面量,那么相当于实现了对象的浅拷贝
http://www.dtcms.com/a/298664.html

相关文章:

  • Node.js(三)之Express
  • Three.js 动画系统入门:Tween.js 与 AnimationMixer 的使用
  • 习题5.6 “数学黑洞“
  • Java研学-RabbitMQ(二)
  • 亚德诺半导体AD8612ARUZ-REEL双通道精密运算放大器,0.5μV超低失调电压+0.02μV/°C温漂!
  • 老龄化浪潮下的破局者:智慧养老重塑银发经济格局
  • ptmalloc(glibc-2.12.1)源码解析2
  • 深入理解 UDP 协议:从原理到实战的技术解析
  • 开源语音TTS与ASR大模型选型指南(2025最新版)(疯聊AI提供)
  • Paimon主键表的合并机制
  • 模糊综合评估法简单示例
  • MySQL的认识与基本操作
  • NaVILA源码解析——从其VLA部分到其low-level部分:涵盖legged-loco、rsl_rl
  • AMD推出Radeon AI Pro R9700:32GB显存加持,发力AI推理与专业图形双场景
  • 13.使用C连接mysql
  • ro属性和persist属性的区别
  • 什么是游戏盾(高防版)?
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-24,(知识点:二极管基础知识,单向导电性)
  • Redux 入门超详细指南
  • vue3中pinia详解
  • 关于“前导零”的问题记录,也就是(0.1)和.1这种数据处理问题
  • streamyfin(世博会)android 编译
  • 0人工沟通,它如何用AI撬动海外B端9400亿采购市场?
  • Round-Robin仲裁器
  • <HMI><威纶通><触摸屏>基于威纶通MT8106iQ触摸屏,实现自定义登录窗口(优化)
  • 内核驱动相关知识点
  • 【Agent】Common Ground 团队协作模型:Partner、Principal 与 Associate
  • 数据结构自学Day14 -- 归并排序
  • 正则表达式 \b:单词边界
  • 模拟flink处理无限数据流