如何定义javascript string.length()函数?

如何定义javascript string.length()函数?,javascript,string,function,Javascript,String,Function,我正在尝试将java代码转换为javascript(js),js缺少许多字符串方法,这让我非常沮丧。 我知道js字符串库,您可以执行someString.length来获取字符串的长度。 但我惊喜地看到,在这个话题的顶部答案中: startsWith方法可以在我自己的js代码文件中定义,如下所示: if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (st

我正在尝试将java代码转换为javascript(js),js缺少许多字符串方法,这让我非常沮丧。 我知道js字符串库,您可以执行someString.length来获取字符串的长度。 但我惊喜地看到,在这个话题的顶部答案中: startsWith方法可以在我自己的js代码文件中定义,如下所示:

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时,我在chrome中遇到以下错误: 未捕获的TypeError:对象的属性“length”不是函数

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

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

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

看看

创建字符串对象后,此属性将保持不变。它具有属性{[[Writable]]:false、[[Enumerable]]:false、[[Configurable]]:false}


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

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

看看

创建字符串对象后,此属性将保持不变。它具有属性{[[Writable]]:false、[[Enumerable]]:false、[[Configurable]]:false}

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

// 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!;)

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

// 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!;)


为什么要将现有属性转换为方法?这是一个非常糟糕的主意。对于大多数代码来说,这是行不通的。语言太不一样了。还请注意,这(如果一开始起作用的话)会破坏其他人的代码。将应用程序翻译成另一种语言的第一步是学习您希望翻译的语言,不要将语言改写为您所翻译的语言。您不能将Java剪切并粘贴到JavaScript中,正如您不能将Java剪切并粘贴到C中一样。请忽略“Java”是“JavaScript”的子字符串这一事实。那太不幸了。试着用它的正式名称来称呼它,取而代之的是ECMAScript。我发现javascript的特性令人沮丧。在我看来,这是穷人的专利。我完全理解你的沮丧。这是典型的从强类型、经典OO语言来到JS的人。如果只考虑JS的java类特性,那么实际上是用语言的一个很差的子集编程。看一看。您可能会开始欣赏JS本身的优点。除了大括号外,它与Java完全不同。为什么要将现有属性转换为方法?这是一个非常糟糕的主意。对于大多数代码来说,这是行不通的。语言太不一样了。还请注意,这(如果一开始起作用的话)会破坏其他人的代码。将应用程序翻译成另一种语言的第一步是学习您希望翻译的语言,不要将语言改写为您所翻译的语言。您不能将Java剪切并粘贴到JavaScript中,正如您不能将Java剪切并粘贴到C中一样。请忽略“Java”是“JavaScript”的子字符串这一事实。那太不幸了。试着用它的正式名称来称呼它,取而代之的是ECMAScript。我发现javascript的特性令人沮丧。在我看来,这是穷人的专利。我完全理解你的沮丧。这是典型的从强类型、经典OO语言来到JS的人。如果只考虑JS的java类特性,那么实际上是用语言的一个很差的子集编程。看一看。您可能会开始欣赏JS本身的优点。除了大括号外,它与Java完全不同。感谢NagaJolkia指针,这是规范中有趣的例外。但我仍然不明白为什么长度是一个属性,这意味着我无法使用length()函数访问它。干杯,@keithphw方法也是属性。如果您这样想的话,它们没有单独的名称空间。函数是JavaScript中的对象,与任何其他值一样存储为属性。因此,当我试图定义一个名为length的新方法时,它与length属性冲突,因为它们都是属性。现在我明白了。非常感谢您的迅速回复。干杯,Keith谢谢NagaJolkia指针,这是规范中有趣的例外。但我仍然不明白为什么长度是一个属性这一事实意味着我不能使用length()函数访问它。干杯,@keithphw方法也是属性。如果您这样想的话,它们没有单独的名称空间。函数是JavaScript中的对象,与任何其他值一样存储为属性。因此,当我试图定义一个名为length的新方法时,它与length属性冲突,因为它们是