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的构造函数。