为什么给js原型对象添加的方法能用在基本类型上?

JavaScript中的几个基本类型,都在对象类型中有一个“亲戚”。它们是:

  • Number;
  • String;
  • Boolean;
  • Symbol。

所以,3 与 new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。

NumberStringBoolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。

Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。

JavaScript 语言设计上试图模糊对象和基本类型之间的关系,我们日常代码可以把对象的方法在基本类型上使用,比如:

1
console.log("abc".charAt(0)); //a

甚至我们在原型上添加方法,都可以应用于基本类型,比如以下代码,在 Symbol 原型上添加了hello方法,在任何 Symbol 类型变量都可以调用。

1
2
3
4
5
Symbol.prototype.hello = () => console.log("hello");

var a = Symbol("a");
console.log(typeof a); //symbol,a并非对象
a.hello(); //hello,有效

所以为什么给js原型对象添加的方法能用在基本类型上?

主要是因为 . 运算符提供了封箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。


为什么给js原型对象添加的方法能用在基本类型上?
https://thaneyang.github.io/2023/05/为什么给js原型对象添加的方法能用在基本类型上?.html
作者
ThaneYang
发布于
2023年5月12日
许可协议