new Javascript创建一个对象的过程,Object.create(null)和{}

161 阅读1分钟

new关键字 Javascript创建一个对象的过程

创建一个对象的流程:

function Person(name,age){
	this.name = name
    this.age = age
    console.log(this)  //Person {name:'zm',age:'12'}
    //return this  //默认隐藏
}


let p1 = new Person('zm',12)

//等同于:

let p1 = new Object()
p1 = Person('zm',12)

new关键字做了什么?

  1. 创建了一个新的对象,类型是Object
  2. 让这个对象的__proto__指向构造器的prototyope
  3. 调用apply方法执行函数
  4. 判断结构是否是object类型,return结果,如下
function myNew(constructor,params){
	var args = [...arguments]
    var constructor = args.shift()
    var obj = new Object()
	obj.__proto__ = constructor.prototype
    var res = constructor.apply(obj,args)
    return typeof res === 'object' ? res : obj
}

//测试
function Pr(name){
	this.name = name
}
let p = myNew(Pr,'zm')   //相当于 let p = new Pr('zm')
console.log(p)

new 和 Object.create()的区别


//Object.create() 相当于下面object的功能(原型式继承)
//本质是实现了对o的浅复制,父类的所有引用属性会被子类共享
function object(o){
	function F(){}
	F.prototype = o
    return new F()
}

Object.create(null)和{}的区别

使用create创建的对象,没有任何属性,显示No properties,我们可以把它当作一个非常纯净的map来使用,我们可以自己定义hasOwnProperty、toString方法,不管是有意还是不小心,我们完全不必担心会将原型链上的同名方法覆盖掉。

总结: 你需要一个非常干净且高度可定制的对象当作数据字典的时候;

想节省hasOwnProperty带来的一丢丢性能损失并且可以偷懒少些一点代码的时候 用Object.create(null)!其他时候,请用{}。