1. 程式人生 > >js new的理解

js new的理解

內部 gif 參數 技術分享 name 復制代碼 lba apply 賦值

var cat = new Animal("cat");

JS引擎執行這句代碼時,在內部做了很多工作,用偽代碼模擬其工作流程如下:

技術分享
new Animal("cat") = {

    var obj = {};

    obj.__proto__ = Animal.prototype;

    var result = Animal.call(obj,"cat");

    return typeof result === ‘object‘? result : obj;
}
技術分享

(1)創建一個空對象obj;

(2)把obj的__proto__ 指向Animal的原型對象prototype,此時便建立了obj對象的原型鏈:obj->Animal.prototype->Object.prototype->null

【如果你不了解JS原型鏈,請先閱讀:JS原型和原型鏈】

(3)在obj對象的執行環境調用Animal函數並傳遞參數“cat”。 相當於var result = obj.Animal("cat")。

當這句執行完之後,obj便產生了屬性name並賦值為"cat"。【關於JS中call的用法請閱讀:JS的call和apply】

(4)考察第3步返回的返回值,如果無返回值或者返回一個非對象值,則將obj返回作為新對象;否則會將返回值作為新對象返回。

js new的理解