JavaScript new 关键字

new 关键字

在JavaScript中, new 关键字用来创建一个类(模拟类)的实例对象。 实例化对象之后, 也就继承了类的属性和方法。 例如:

function Person(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.getName = function(){
  return this.name;
};

var person = new Person('james', 18);
console.log(person.name, person.age);
person.getName();

在以上代码中 var person = new Person('james', 18);中的new关键字做了些什么呢?用伪代码来模拟其执行的过程如下:

new Person('james', 18)  = {
  var obj = {};
  obj.__proto__ = Person.prototype;
  var res = Person.call(obj, 'james', 18);
  return typeof res === 'object' ? res : obj;
}

在JavaScript中, 使用new关键字后, 意味着做了如下4件事:

  • 创建一个新的空对象 {}
  • 设置这个对象原型指向构造函数, 即上例中的obj.__proto = Person.prototype
  • 执行构造函数, 当this关键字被提及的时候, 使用新创建的对象的属性。
  • 返回新创建的对象(除非构造函数中返回的是“无原型”)。

在创建一个新对象成功之后, 如果调用一个新对象没有的属性或方法的时候, JavaScript会沿着原型链向上逐层查找对应的属性或方法。 这就类似于传递的“类继承”。

继承

JavaScript对象有一个特殊的prototype内置属性, 其实就是对于其他对象的引用, 几乎所有的对象在创建时, prototype的属性都会被赋予一个非空的值(除了object.create(null))。 所有普通的prototype链最终都会指向内置的object.prototype. 里面包含了很多常见的功能, 如: toString(), valueOf(), hasOwnProperty(), isPrototypeOf()等等。

如果上例中的构造函数Person,实例化一个对象 obj后, obj的原型的构造器函数指向Person构造函数, obj.proto.proto指向Object的构造函数。

image.png

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容