1、字面量创建对象
<script>
var obj1 = {
name: '大大大'
}
console.log(obj1)
</script>
![在这里插入图片描述](https://img-blog.csdnimg.cn/7faa6c75a406413080bc8712794ddbcd.png)
2、new创建对象
<script>
var obj = new Object();
obj.name = '小小小';
console.log(obj)
</script>
![在这里插入图片描述](https://img-blog.csdnimg.cn/f1c995e99f4245cc9a3fc0b013bdc671.png)
3、new内部都实现了什么:
- 创建一个新对象
- 使新对象的__proto__指向原函数的prototype
- 改变this指向(指向新的obj)并执行该函数,执行结果保存起来作为result
- 判断执行函数的结果是不是null或Undefined,如果是则返回之前的新对象,如果不是则返回result
如下:手写一个new:
function myNew(fn, ...args) {
let obj = {}
obj.__proto__ = fn.prototype
let result = fn.apply(obj, args)
return result instanceof Object ? result : obj
}
4、字面量的好处是:
- 可读性,可维护性好,更加体现了封装性。
- 性能略好,js引擎不用解析作用域,因为不用担心出现同名构造函数Object()。
- 其实这种方式是没有调用Object()构造函数的,js引擎会帮你先创建一个空对象,然后改变this指向你创建的对象即可。
- 若函数有大量参数,推荐使用对象字面量传参,也就是直接传一个对象作为参数。这样不仅不用担心参数是否必需,而且也省去了参数顺序的麻烦。
5、补充:字面量new出来的对象和 Object.create(null)创建出来的对象有什么区别?
- 字面量和new创建出来的对象会继承Object的方法和属性,他们的隐式原型会指向Object的显式原型,
- 而 Object.create(null)创建出来的对象原型为null,作为原型链的顶端,自然也没有继承Object的方法和属性