1

我正在尝试将 java 代码转换为 javascript (js),我对 js 缺少许多字符串方法感到非常沮丧。我知道 js 字符串库,并且您可以执行 someString.length 来获取字符串的长度。但我惊喜地看到这个主题的最高答案: 如何检查一个字符串“StartsWith”是否是另一个字符串? 可以在我自己的js代码文件中定义startsWith方法,如下所示:

if (typeof String.prototype.startsWith != 'function') {
  String.prototype.startsWith = function (str){
    return this.indexOf(str) == 0;
  };
}

所以我尝试对长度方法做类似的事情:

if (typeof String.prototype.length != 'function') {
  String.prototype.length = function (){
    return this.length;
  };
}
var str = "a string";
alert(str.length());

但它不起作用,当我尝试调用时,我在 chrome 中收到以下错误: Uncaught TypeError: Property 'length' of object is not a function

有谁知道为什么我不能像上面解释的 startsWith(str) 方法那样创建一个 length() 函数?谢谢,基思

4

2 回答 2

9

String 实例是使用length不继承自 String.prototype 的不可变属性创建的。因此,您将无法length()为字符串创建方法。

http://ecma-international.org/ecma-262/5.1/#sec-15.5.5

String 实例从 String 原型对象继承属性,并且它们的 [[Class]] 内部属性值为“String”。字符串实例还具有 [[PrimitiveValue]] 内部属性、长度属性和一组具有数组索引名称的可枚举属性。

并参见http://ecma-international.org/ecma-262/5.1/#sec-15.5.5.1

一旦创建了 String 对象,此属性就不会改变。它具有属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。

于 2013-07-06T17:59:20.423 回答
0

这很简单。只需实现对象的原型。

// Defines the name what You want
String.prototype.size = function () {
   return this.length;
}

'abc'.size ();

如果您想要一些不错的实现,请继续:

// Defines the name what You want
String.prototype.untilChar = function (charEnding) {
   return charEnding && this.includes (charEnding) ? this.substr (0, this.indexOf (charEnding)).length : this.length;
}

'abcdefg'.untilChar ('d'); // Returns 3
'abcdefg'.untilChar ('z'); // Returns 7

如果您无法获得正确的解决方案,甚至不要尝试使用 runarounds!;)

于 2020-12-18T15:13:23.707 回答