JavaScript 中 new 操作符執行時走了哪些步驟

一、場景
我們在使用JavaScript是,會經常碰上new這個操作符來進行實例化,我們來看一下new 這個操作符執行時走了哪些步驟

二、實例


function A(name){
    this.name = name ;
};
var zhangsan = new Person('張三');
var zhangsans = new Person('張三');
console.log(zhangsan);//{name:張三};
console.log(zhangsan);//{name:張三};
console.log(zhangsan == zhangsans);//false;
console.log(zhangsan.__proto__ == zhangsans.__proto__);//true;

經過實例可以發現一個問題,zhangsan和zhangsans在方法與傳參上都是一樣的,最後比較方法是爲false ,比較方法的原型時卻是相等的,這就說明通過new實例化出來的方法是不相同的,原型比較爲true,證明參數源是一樣的

接下來看一下new的過程,一兩個方法來展示


function A(name){
    this.name = name ;
};

function NewFun(fun,...param){
    //1.首先創建一個空對象
    var obj = {};
    //2.設置原型鏈
    obj.__proto__=fun.prototype;
    //2.將空對象作爲 this,調用構造函數並傳入參數
    var result=fun.call(obj,...param);
    //4.如果構造函數返回值爲對象或者函數,則返回該對象或者函數,否則返回創建的新對象obj
    return  typeOf result === "object" || typeOf result === "function"?result:obj
}

    NewFun(A,'張三')

默認情況下函數返回值爲undefined,即沒有顯示定義返回值的話,但構造函數例外,new構造函數在沒有return的情況下默認返回新創建的對象。

但是,在有顯示返回值的情況下,如果返回值爲基本數據類型{string,number,null,undefined,Boolean},返回值仍然是新創建的對象。

只有在顯示返回一個非基本數據類型時,函數的返回值才爲指定對象。在這種情況下,this所引用的值就會被丟棄了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章