一文搞懂Object.create()、new Object()和{}创建对象的区别

前言

有道是,万物皆对象。我们在平常的开发过程中肯定是要使用到对象的,我们创建一个对象的时候,最常用的当然是用最简单直接的字面量创建,例如let a = {}.

但是,想必大家都知道,js创建对象还有可以用new操作符或者是Object.create()方法

总结:创建对象的三种方法:

1. 字面量创建 :var obj1 = {};

2. new操作符创建:new Object();

3. Object.create()创建:Object.create(null);

那么,他们之间有什么区别呢?

另外,本期博客参与了【新星计划】,还请大家三连支持一下🌟🌟🌟感谢感谢💓💓💓

目录

看区别直接跳最后一章

目录

字面量创建

new操作符创建

Object.create()

区别


字面量创建

没有属性的空对象可以用以下方式创建:

let obj = {};

字面量创建对象的优势在于,可以用内含属性的花括号快速创建对象。简单地编写一个逗号分隔的键值对的类别。

new操作符创建

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例

在调用 new 的过程中会发生四件事情:

  • 创建一个空对象(即{});
  • 为新对象添加属性__proto__,将该属性链接至构造函数的原型对象 ;
  • 执行构造函数方法,属性和方法被添加到this引用的对象中;
  • 如果构造函数中没有返回新对象,那么返回this,即创建这个新对象,否则,返回构造函数中返回的对象

Object.create()

Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 (请打开浏览器控制台以查看运行结果。)

参数:

proto:新创建对象的原型对象(即新对象原型指向这个对象参数)

propertiesObject(可选):新对象指定的属性,是一个对象形式的配置

  • value: 属性的默认值, 默认为undefined
  • congigurable: 能否使用delete、能否修改属性特性、或能否修改访问器属性、false为不可重新定义,默认值为true
  • enumberable: 可枚举性,对象属性能否通过for-in 循环,默认为true
  • writable: 对象属性是否可修改,默认为true,可修改,设置false可理解为常量不可修改

举个栗子:

let newObj = Object.create(
 {name:'sun'},
 {
   age: {
     value: 24, // 属性默认值
     congigurable: false, // 设置false之后将不能不删除
     enumerable: true,
     writable: false,  // 设置false之后将不能修改
   }
 }
)

返回值:

一个新对象,带着指定的原型对象和属性(它并不会继承源对象的属性)。

区别

1. 创建空对象的区别

如果你要创建一个干净的空对象,推荐使用Object.create(null),因为我们传入null当做它的参数,所以它创建的对象不会有原型,也不会有Object 原型对象的任何属性(例如toString,hasOwnProperty等)

Object.create(null)可以创建一个干净且高度可定制的对象当做数据字典,进行循环取用,可以提高循环效率。

这个时候如果对象有原型链,那便会在循环的时候去循环它的各个属性和方法,效率则会降低

2. 创建对象的区别

  • Object.create()创建的对象只是原型指向源对象,并不会继承它的任何属性;而new出来的对象是会继承原型对象的属性和方法。如下:

let obj = {
  name: '阿彬',
  age: 10,
  foo: function() {
    console.log(this.age)
  }
}
let a = Object.create(obj)
let b = new Object(obj)

a.name = '彬'
b.name = '彬'

console.log(a.name,a,a.foo()); 
//彬 {name: '彬'} 10
        
console.log(b.name,b,b.foo());
//彬 {name: '彬', age: 10, foo: ƒ} 10

可以看到,分别打印a和b,通过Object.create()创建的a是没有原型对象的age属性和foo方法的。而之所以它也可以执行foo方法,是因为向原型链追溯,找到了原型对象的这个方法执行了。

3. 字面量创建和new创建

从创建对象的过程来讲,这两者底层实现基本是没有区别的。但是new Object()本质上是方法(只不过这个方法是内置的)调用, 既然是方法调用,就涉及到在proto链中遍历该方法,当找到该方法后,又会生产方法调用必须的堆栈信息,方法调用结束后,还要释放该堆栈。

所以,相比来说,更推荐直接字面量创建,更简洁,更高效

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作封装在对象中,通过对象之间的交互实现程序的设计和开发。下面是一些关键概念,帮助你更好地理解Python面向对象编程。 1. 类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。它定义了对象的特征和方法。例如,我们可以定义一个名为"Car"的类来表示汽车,其中包含属性(如颜色、型号)和方法(如加速、刹车)。 2. 对象Object):对象是类的实例,是具体的实体。通过实例化类,我们可以创建一个对象。例如,我们可以创建一个名为"my_car"的对象,它是基于"Car"类的实例。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。每个对象都可以具有一组属性。例如,"Car"类的属性可以包括颜色、型号等。 4. 方法(Method):方法是对象的行为,用于定义对象的操作。每个对象都可以具有一组方法。例如,"Car"类的方法可以包括加速、刹车等。 5. 继承(Inheritance):继承是一种机制,允许我们创建一个新类(称为子类),从现有类(称为父类)继承属性和方法。子类可以扩展或修改父类的功能。继承可以实现代码重用和层次化设计。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一方法做出不同的响应。多态提高了代码的灵活性和可扩展性。 7. 封装(Encapsulation):封装是一种将数据和操作封装在对象中的机制,隐藏了对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,提供了更好的模块化和代码复用性。 通过理解这些概念,你可以更好地掌握Python面向对象编程。在实践中,你可以使用类来创建对象,操作对象的属性和调用对象的方法,通过继承和多态实现代码的灵活性和可扩展性,通过封装保护数据的安全性和提高代码的可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端阿彬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值