多的就不扯了,先来个例子,看看new Object()和{}
let objB = {}; // let objB = new Object(); objB.name = 'b'; objB.sayName = function () { console.log(`My name is ${this.name} !`); } console.log(objB) console.log(objB.__proto__ === Object.prototype); // true objB.sayName();得到 当new Object()没有传入值时,和{}是一样的; 那么new操作究竟干了些什么呢
var obj = new Object(); // 创建一个空对象 obj.__proto__ = F.prototype; // obj的__proto__指向构造函数的prototype var result = F.call(obj); // 把构造函数的this指向obj,并执行构造函数把结果赋值给result if (typeof(result) === 'object') { objB = result; // 构造函数F的执行结果是引用类型,就把这个引用类型的对象返回给objB } else { objB = obj; // 构造函数F的执行结果是值类型,就返回obj这个空对象给objB }再来看看 Object.create(),其实Object.create()可以传两个参数,第一个为新创建对象的原型对象,第二个为自身定义的属性,类似Object.defineProperty的第三个参数
const person = { isHuman: false, printIntroduction: function () { console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`); } }; const me = Object.create(person, { p: { value: 42, writable: true, configurable: true } }); me.name = 'Matthew'; me.isHuman = true; console.log(me) console.log(me.__proto__ === Object.prototype) // false me.printIntroduction();结果 总结 当new Object()不传参数时,字面量{}和new关键字创建的对象是Object的实例,原型指向Object.prototype,继承内置对象Object Object.create(arg, pro)创建的对象的原型取决于arg,arg为null,新对象是空对象,没有原型,不继承任何对象;arg为指定对象,新对象的原型指向指定对象,继承指定对象