实现new操作符的原理
function A (x) {
this.x = x;
}
function newA (x) {
var o = {};
o.__proto__ = A.prototype; // 原型继承
A.call(o, x);
return o;
}
var a = newA(1); // 该方法与var a = new A(1)相同
console.log(a.x); // 1
理解proto和prototype
在js中每个对象一定对应一个原型对象(proto),并从原型对象继承属性和方法。
a.__proto__ === A.prototype
不像每个对象都有proto属性来标识自己所继承的原型,只有函数才有prototype属性。当你创建函数时,JS会为这个函数自动添加prototype属性,值是空对象。而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的proto指向承构造函数的prototype来实现这种继承)。