共计 1735 个字符,预计需要花费 5 分钟才能阅读完成。
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() 理解
我是 Cloudy,年轻的前端攻城狮一枚,爱专研,爱技术,爱分享。
个人笔记,整理不易,感谢阅读、点赞和收藏。
文章有任何问题欢迎大家指出,也欢迎大家一起交流前端各种问题!
正文完
发表至: javascript
2019-06-28