JavaScript中的new操作符

話不多說,直接看荔枝:

var num = Number(1)
var num1 = new Number(1)
console.log(typeof num)
console.log(num instanceof Number)
console.log(num instanceof Object)
console.log("------")
console.log(typeof num1)
console.log(num1 instanceof Number)
console.log(num1 instanceof Object)

結(jié)果輸出:

number
false
false
------
object
true
true

從上面的荔枝我們可以看出使用new操作符后,typeof這個實(shí)例,得到的object,而不是number,這時候你只能使用instanceof來判斷它是否是Number,其實(shí)本質(zhì)原因是因?yàn)閚ew操作符在背后做了手腳,具體它做了什么呢?
直接上荔枝:

var obj = new Base();

對于Base這個對象,執(zhí)行以下三個語句

var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

這個只是個簡單的例子,new實(shí)際上做了5件事情

  • 在堆中開辟對象內(nèi)存空間, 記為obj
  • obj 中添加proto屬性并指向 構(gòu)造函數(shù).prototype
  • 將構(gòu)造函數(shù)中的this 指向obj
  • 執(zhí)行構(gòu)造函數(shù)內(nèi)語句
  • 若構(gòu)造函數(shù)中沒有reutrn 或return this或基本類型(number、string、boolean、null、undefined)的值,則返回obj在堆中的內(nèi)存地址;若return 引用類型,則返回值為這個引用類型

仿寫new函數(shù)如下:

function Student(name, age) {
  this.name = name;
  this.age = age;
}

function _new() {
  console.log(arguments)
  console.log(...arguments)
  console.log('---------------')
  let args = [...arguments];
  console.log(args, "args")
  console.log(args instanceof Array)
  console.log(args.slice(1))
  console.log(...args.slice(1))
  let constructor = args[0];
  let obj = Object.create(constructor.prototype);
  let res = constructor.call(obj, ...args.slice(1))
  if ((typeof res == 'object' || typeof res == 'function') && res != null) {
    return res;
  } else {
    return obj;
  }
}

let s = new Student("z",18)
let _s = _new(Student,'l',19)
console.log(s)
console.log(typeof s)
console.log('-------')
console.log(_s)
console.log(typeof _s)

結(jié)果輸出如下:

[Arguments] { '0': [Function: Student], '1': 'l', '2': 19 }
[Function: Student] 'l' 19
---------------
[ [Function: Student], 'l', 19 ] 'args'
true
[ 'l', 19 ]
l 19
Student { name: 'z', age: 18 }
object
-------
Student { name: 'l', age: 19 }
object
除了new之外,typeof、instanceof也是有區(qū)別的,總結(jié)出來就是一句話,

判斷一個變量的類型非常簡單。簡單數(shù)值類型的類型判斷用typeof,引用類型的類型判斷用instanceof

JavaScript中哪些屬于引用類型,哪些是基本數(shù)值類型呢?
詳情請參考博客:http://www.itdecent.cn/p/a6bfe51ac7b1

參考博客:https://blog.csdn.net/lyt_angularjs/article/details/86623988

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容