gpt4 book ai didi

javascript - 将函数绑定(bind)到 String.prototype 以便它始终绑定(bind)到字符串

转载 作者:行者123 更新时间:2023-11-29 10:44:10 24 4
gpt4 key购买 nike

String.prototype.contains = function(str) {
return this.indexOf(str) !== -1;
};

此代码段确实扩展了 String.prototype
它适用于像 'foobar'.contains('foo');
这样的函数调用但如果它作为函数传递而不是调用它,它就不能很好地工作:

var str = 'foobar';
['foo', 'bar'].every(str.contains);
TypeError: Object [object global] has no method 'indexOf'

我知道你可以:

['foo', 'bar'].every(str.contains.bind(str));

或类似的东西:

['foo', 'bar'].every(function(item) { return str.contains(item); });

但他们只是让我感到尴尬。
在我创建的 Constructor 函数中,尽管它不是这样工作的:

function Foo(myStr) {
this.myStr = myStr;

this.contains = function(fragment) {
return this.myStr.indexOf(fragment) !== -1;
};
}
var someFoo = new Foo('foobar');
['foo', 'bar'].every(someFoo.contains)
TypeError: Cannot call method 'indexOf' of undefined

我可以这样做来让它工作:

function Foo(myStr) {
var self = this; // Line added
this.myStr = myStr;

this.contains = function(fragment) {
return self.myStr.indexOf(fragment) !== -1; // this changed to self
};
}

我想知道是否有一种方法可以扩展 String.prototype,这样我就不必将 'someString'.contains 绑定(bind)到 'someString ' 每次我将它用作函数而不调用它时。

最佳答案

试试这个:

Object.defineProperty(String.prototype, "contains", {
get: function () {
return (function(str) {
return this.indexOf(str) !== -1;
}).bind(this);
}
});

它定义了一个带有 getter 的新属性,这意味着每次您“获取”该函数时,例如在 ['foo', 'bar'].every(str.contains); 中,在这种情况下,将调用上面定义的函数,并且该函数的返回值将作为 str.contains 返回。功能和你的一样,只不过我们在getter中绑定(bind)了this,也就是字符串,这就是我们想要的。

如果 Object.defineProperty 没有在您的浏览器中定义(或任何人使用您的代码),您可以使用 __defineGetter__ 代替。

完整的解决方案如下所示:

addPropertyWithGetter = function(object, property) {

getter = function () {
return (function(str) {
return this.indexOf(str) !== -1;
}).bind(this);
}

if (_.isFunction(Object.defineProperty)) {
return Object.defineProperty(object, property, {
get: getter,
});
} else {
object.__defineGetter__(property, getter);
}
}

以及用法:

addPropertyWithGetter(String.prototype, "contains")

关于javascript - 将函数绑定(bind)到 String.prototype 以便它始终绑定(bind)到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22733804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com