new 操作符都做了什么

解答

stackoverflow 原提问,https://stackoverflow.com/questions/9468055/what-does-new-in-javascript-do-anyway

new f(a, b, c)

is eaqal to

var newInstance = {};

newInstance.__proto__ = f.prototype;

var result = f.call(newInstance, a, b, c);

// If the result is a non-null object, use it, otherwise use the new instance.
result && typeof result === 'object' ? result : newInstance;

testing

var f = function () {
    this.test = 1;
}
f.prototype.testFn = function () {
    console.log(12);
}

var newInstance = {};

newInstance.__proto__ = f.prototype;

var result = f.call(newInstance);

// If the result is a non-null object, use it, otherwise use the new instance.
result && typeof result === 'object' ? result : newInstance;

疑问:'1'.toString()为什么可以调用?

其实在这个语句运行的过程中做了这样几件事情:

var s = new Object('1');
s.toString();
s = null;
  • 第一步: 创建Object类实例。注意为什么不是String ? 由于Symbol和BigInt的出现,对它们调用new都会报错,目前ES6规范也不建议用new来创建基本类型的包装类。
  • 第二步: 调用实例方法。
  • 第三步: 执行完方法立即销毁这个实例。

整个过程体现了基本包装类型的性质,而基本包装类型恰恰属于基本数据类型,包括 Boolean, Number 和 String。

那为什么 1.toString() 报错?

> 1.toString()
VM416:1 Uncaught SyntaxError: Invalid or unexpected token

这是因为 JavaScript 的解释器会把数字后的"."当作小数的点,引发了语法错误。

posted @ 2020-03-16 00:07  Ever-Lose  阅读(169)  评论(0编辑  收藏  举报