JavaScript之new运算符

new运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new关键字会进行如下的操作:

1. 创建一个空的简单JavaScript对象(即{});
2. 链接该对象(即设置该对象的构造函数)到另一个对象 ;
3. 将步骤1新创建的对象作为this的上下文 ;
4. 如果该函数没有返回对象,则返回this。
var cat = new Animal("cat");

new Animal("cat") = function () {
    var obj = {};        // 第1步
    obj.__proto__ = Animal.prototype;    // 第2步
    var result = Animal.call(obj,"cat");    // 第3步:obj.Animal("cat")
    return typeof result === 'object'? result : obj;    // 第4步
}

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

var car1 = new Car('Eagle', 'Talon TSi', 1993);

console.log(car1.make);// expected output: "Eagle"

创建一个用户自定义的对象需要两步:

1. 通过编写函数来定义对象类型。
2. 通过new来创建对象实例。

创建一个对象类型,需要创建一个指定其名称和属性的函数;对象的属性可以指向其他对象,看下面的例子:
当代码new Foo(…)执行时,会发生以下事情:

1. 一个继承自Foo.prototype的新对象被创建。
2. 使用指定的参数调用构造函数Foo,并将 this绑定到新创建的对象。newFoo等同于new Foo(),也就是没有指定参数列表,Foo不带任何参数调用的情况。
3. 由构造函数返回的对象就是new表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)

你始终可以对已定义的对象添加新的属性。例如,car1.color = "black"语句给car1添加了一个新的属性color,并给这个属性赋值 "black"。但是,这不会影响任何其他对象。要将新属性添加到相同类型的所有对象,你必须将该属性添加到Car对象类型的定义中。
你可以使用Function.prototype属性将共享属性添加到以前定义的对象类型。这定义了一个由该函数创建的所有对象共享的属性,而不仅仅是对象类型的其中一个实例。下面的代码将一个值为null的color属性添加到car类型的所有对象,然后仅在实例对象car1中用字符串 "black" 覆盖该值。详见 [prototype](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype) 。
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

推荐阅读:
JavaScript之call()理解


03-06 00:09