1. 什么是new运算符?
new运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
2. new运算符具体做了什么?
- 创建一个空对象{}
- 空对象的
_proto_
指向构造函数的prototype
(即空对象继承构造对象的原型) - 将新创建的对象作为
this
的上下文 - 如果没有返回其他对象,即返回该新对象
this
3. 使用new运算符的注意项
- 如果对某个对象实例进行属性添加等操作,并不会影响构造函数和其他对象实例
- 如果对构造函数的属性进行操作,将会影响所有的对象实例 ```javascript function Car() {} car1 = new Car(); car2 = new Car();
console.log(car1.color); // undefined
Car.prototype.color = “original color”; console.log(car1.color); // original color
car1.color = ‘black’; console.log(car1.color); // black
console.log(car1.proto.color) //original color console.log(car2.proto.color) //original color console.log(car1.color) // black console.log(car2.color) // original color
<a name="xJqNz"></a>
### 4. new的模拟实现
```javascript
function objectFactory() {
var obj = new Object(); // 创建一个空对象
Constructor = [].shift.call(arguments); // 删除arguments的第一项,从而取得外部传入的构造器
obj._proto_ = Constructor.prototype // 继承构造函数的原型
var ret = Constructor.apply(obj, arguments); // 改变this指向,将返回值设为ret
return typeof ret === 'object' ? ret:obj // 如果返回值不为object,则返回obj,否则返回ret
}