前言
有道是,万物皆对象。我们在平常的开发过程中肯定是要使用到对象的,我们创建一个对象的时候,最常用的当然是用最简单直接的字面量创建,例如let a = {}.
但是,想必大家都知道,js创建对象还有可以用new操作符或者是Object.create()方法
总结:创建对象的三种方法:
1. 字面量创建 :var obj1 = {};
2. new操作符创建:new Object();
3. Object.create()创建:Object.create(null);
那么,他们之间有什么区别呢?
另外,本期博客参与了【新星计划】,还请大家三连支持一下🌟🌟🌟感谢感谢💓💓💓
目录
看区别直接跳最后一章
目录
字面量创建
没有属性的空对象可以用以下方式创建:
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链中遍历该方法,当找到该方法后,又会生产方法调用必须的堆栈信息,方法调用结束后,还要释放该堆栈。
所以,相比来说,更推荐直接字面量创建,更简洁,更高效