为什么JS中Symbol不能用new创建

注意到很多js的基本数据类型都能用new创建,但是Symbol作为新的js数据类型却不能以此方式创建。基本数据类型用new创建可以得到包装对象,而非再是字面量,

类似于Java中new String(“hello”) 和 "hello"的区别

这是用new创建出来不同的点,因此可以推测是官方不希望我们获得Symbol类型的包装对象。不过通过Object()方法还是可以得到其包装对象。
下面是一些拓展:

用new创建对象和不用new创建对象的区别

MDN文档中我们可以看到如下解释:

  1. 创建一个空的简单 JavaScript 对象(即 {});
  2. 为步骤 1 新创建的对象添加属性 proto,将该属性链接至构造函数的原型对象;
  3. 将步骤 1 新创建的对象作为 this 的上下文;
  4. 如果该函数没有返回对象,则返回 this

也就是说new Foo()本质上还是调用Foo()方法,只不过new关键字再对其进行一些额外操作。由此可以得到下一个结论:

Symbol内部是怎么知道我们使用new关键字的

有很多种方法判断是否使用new,这里我们假设Symbol()函数如下:

function Symbol(){
    
    
	//native code here
	if(this instanceof Symbol){
    
    
		throw new Error('Uncaught TypeError: A is not a constructor')
	}
}

由于new关键字会返回一个对象,且__proto__会指向原型对象,所以会发生报错。
而仅仅只是Symbol()方法返回值时,其数据类型为基本数据类型’symbol’,使用instanceof至少需要左操作数为对象类型,所以返回值为false,不会报错。

猜你喜欢

转载自blog.csdn.net/weixin_55658418/article/details/128802465
今日推荐