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关键字做了什么?
- 创建了一个新的对象,类型是Object
- 让这个对象的__proto__指向构造器的prototyope
- 调用apply方法执行函数
- 判断结构是否是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)!其他时候,请用{}。