new
關鍵字
在JavaScript中, new 關鍵字用來創(chuàng)建一個類(模擬類)的實例對象肛走。 實例化對象之后辙芍, 也就繼承了類的屬性和方法。 例如:
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關鍵字做了些什么呢羹与?用偽代碼來模擬其執(zhí)行的過程如下:
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件事:
- 創(chuàng)建一個新的空對象
{}
- 設置這個對象原型指向構造函數(shù)纵搁, 即上例中的
obj.__proto = Person.prototype
- 執(zhí)行構造函數(shù)吃衅, 當this關鍵字被提及的時候, 使用新創(chuàng)建的對象的屬性腾誉。
- 返回新創(chuàng)建的對象(除非構造函數(shù)中返回的是“無原型”)徘层。
在創(chuàng)建一個新對象成功之后, 如果調用一個新對象沒有的屬性或方法的時候利职, JavaScript會沿著原型鏈向上逐層查找對應的屬性或方法趣效。 這就類似于傳遞的“類繼承”。
繼承
JavaScript對象有一個特殊的prototype
內置屬性, 其實就是對于其他對象的引用猪贪, 幾乎所有的對象在創(chuàng)建時跷敬, prototype
的屬性都會被賦予一個非空的值(除了object.create(null))。 所有普通的prototype
鏈最終都會指向內置的object.prototype. 里面包含了很多常見的功能热押, 如: toString(), valueOf(), hasOwnProperty(), isPrototypeOf()等等西傀。
如果上例中的構造函數(shù)Person,實例化一個對象 obj后, obj的原型的構造器函數(shù)指向Person構造函數(shù)桶癣, obj.proto.proto指向Object的構造函數(shù)拥褂。
image.png