字面量创建好处
- 字面量创建对象更简单,方便阅读;
- 不需要作用域解析,速度更快。
new内部
- 创建一个空对象;
- 使新对象的__proto__指向原函数的prototype;
- 改变this指向(指向新的obj)并执行该函数,执行结果保存起来作为result;
- 判断执行函数的结果是否是Null/Undefined,如果是,则返回之前的新对象,否则返回result。
function myNew(fn, ...args) {
// 创建一个空对象
let obj = {};
// 使空对象的隐式原型指向原函数的显式原型
obj.__proto__ = fn.prototype;
// this指向obj
let result = fn.apply(obj, args);//相当于obj.fn(args)
// 返回
return result instanceof Object ? result : obj;
}
字面量和new创建出来的对象与Object.create(null)创建出来的对象的区别
- 字面量和new创建出来的对象会继承Object的方法和属性,创建出来的对象的隐式原型(proto)会指向Object的显示原型;
- 而Object.create(null)创建出来的对象原型为null,作为原型链的顶端,就没有继承Object的方法和属性。