向字符串类添加方法

IT技术 javascript
2021-01-28 17:36:16

我希望能够在 javascript 中说这样的话:

   "a".distance("b")

如何将我自己的距离函数添加到字符串类?

6个回答

您可以扩展String原型;

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        alert(char + " does not appear in " + this);
    } else {
        alert(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

...并像这样使用它;

"Hello".distance("H");

在此处查看 JSFiddle

实际上,对我来说,this返回一个像String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, [[PrimitiveValue]]: "test"}. 为了处理实际文本,我不得不打电话this.toString()
2021-03-12 17:36:16
有没有办法在 ECMA 脚本中编写“String.prototype.distance = function (char) {}”?
2021-03-19 17:36:16
仅供参考.. 用于this获取调用此函数的字符串
2021-04-07 17:36:16
扩展原生 JavaScript 对象通常是一种不好的做法。参见stackoverflow.com/questions/14034180/...
2021-04-09 17:36:16
String.prototype.distance = function( arg ) {
    // code
};

最小的例子:

没有人提到valueOf

==================================================

String.prototype.
OPERATES_ON_COPY_OF_STRING = function ( 
    ARGUMENT 
){

    //:Get primitive copy of string:
    var str = this.valueOf();

    //:Append Characters To End:
    str = str + ARGUMENT;

    //:Return modified copy:
    return( str );
};

var a = "[Whatever]";
var b = a.OPERATES_ON_COPY_OF_STRING("[Hi]");
console.log( a ); //: [Whatever]
console.log( b ); //: [Whatever][Hi]

==================================================

从我对它的研究来看,没有办法就地编辑字符串。

即使您使用字符串对象而不是字符串原语。

下面不起作用并且在调试器中得到非常奇怪的结果。

==================================================

String.prototype.
EDIT_IN_PLACE_DOES_NOT_WORK = function ( 
    ARGUMENT 
){

    //:Get string object:
    var str = this;

    //:Append Characters To End:
    var LN = str.length;
    for( var i = 0; i < ARGUMENT.length; i++){
        str[LN+i] = ARGUMENT[ i ];
    };

};

var c = new String( "[Hello]" );
console.log( c );
c.EDIT_IN_PLACE_DOES_NOT_WORK("[World]");
console.log( c );

==================================================

我正在为字符串类创建一个新方法,例如String.prototype.toJadeCase(). 这个答案帮助我实现了这一目标。
2021-03-21 17:36:16
虽然接受的答案回答了原始问题,但这是一个更强大的总体答案。我一定要问为什么 return(str) vs return str?
2021-03-30 17:36:16
这正是我正在寻找的。
2021-04-10 17:36:16

经过多年(和 ES6)......我们有了一个新的选择来做到这一点:

Object.defineProperty( String.prototype, 'distance', {
	value: function ( param )
	{
		// your code …
		return 'counting distance between ' + this + ' and ' + param;
	}
} );

// ... and use it like this:
const result = "a".distance( "b" );
console.log(result);

你可以这样做:

String.prototype.distance = function (){ 
    //your code 
}
这是一个语法错误(您注释掉了右花括号):D
2021-03-22 17:36:16