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"
建立一个用户自定义的对象须要两步:segmentfault
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()理解this
我是Cloudy,年轻的前端攻城狮一枚,爱专研,爱技术,爱分享。
我的笔记,整理不易,感谢阅读、点赞和收藏。
文章有任何问题欢迎你们指出,也欢迎你们一块儿交流前端各类问题!