为何String.repeat可正常调用?控制台中它非String()等的Symbol
关于String.repeat()的工作原理详解
首先得澄清一个关键点:你提到的其实是两个不同的repeat方法,它们的挂载位置和调用方式不同,但都能正常工作,我们逐一拆解:
1. 你代码里使用的是字符串实例方法:String.prototype.repeat
你的示例代码里"dad".repeat(3)调用的是字符串原型上的实例方法,这个方法是ES6(ECMAScript 2015)引入的。
所有字符串字面量(比如"dad")或者通过new String()创建的字符串实例,都会继承String.prototype上的方法,所以你能直接在字符串上调用.repeat()。
你可以在控制台验证这一点:
console.log(String.prototype.hasOwnProperty('repeat')); // 输出true console.log("dad".__proto__ === String.prototype); // 输出true,说明字符串实例继承自String原型
2. 你疑问的String.repeat是静态方法:ES2022新增的构造函数方法
String.repeat()是ES2022(ECMAScript 2022)新增的静态方法,它直接挂载在String构造函数本身,而不是原型上。这意味着你不需要创建字符串实例,直接通过String.repeat(str, count)就能调用。
比如:
console.log(String.repeat("dad", 3)); // 同样返回"daddaddad" console.log(String.repeat("luyluy", 0)); // 返回空字符串
为什么你觉得它“无所属对象”?
可能是你在控制台的查询方式有误:
- 要查看String构造函数的自有属性,使用
Object.getOwnPropertyNames(String),在支持ES2022的环境里,你会看到'repeat'出现在列表中。 - 用
String.hasOwnProperty('repeat')也会返回true,证明它是String自身的静态属性,并非无所属。
如果你的环境不支持ES2022,那String.repeat确实不存在,但你的实例方法调用"dad".repeat()依然能正常工作,因为ES6的支持范围更广。
总结
- 实例方法
str.repeat(count):给字符串实例用,继承自String.prototype,ES6引入。 - 静态方法
String.repeat(str, count):给String构造函数用,直接挂载在String上,ES2022引入。
两者功能类似,只是调用方式不同,这就是它们能正常工作的原因。
内容的提问来源于stack exchange,提问作者Jean-Dadet Diasoluka
相关产品推荐
相关产品推荐

