我知道可以像这样覆盖JS中的函数:
var indexOf = String.prototype.indexOf;
String.prototype.indexOf = function(){
//MY CODE HERE
return indexOf.call(this, arguments);
};
这是覆盖从String调用的indexOf()
。
是否可以覆盖将从null调用的indexOf()
?
var a = null; a.indexOf("foo")
应该返回-1
。邪恶吧?
答案 0 :(得分:2)
var a = null,
b = 'foobar';
console.log( (a+'').indexOf('foo') );
console.log( (b+'').indexOf('foo') );

将null连接到字符串然后检查,如果你真的想要indexOf
答案 1 :(得分:1)
null
(和undefined
)不支持属性访问(点运算符),换句话说,null.whatever
永远不会有效。所以你要找的东西是不可能的。 Reference
此外,一些(大多数?)内置方法(包括indexOf
)也不支持null
绑定,因此''.indexOf.call(null,...)
也无法工作。< / p>
我理解你的问题背后的基本原理,在nulls上使用方法可以在&#34; map-invoke&#34;上下文,比如
source.map(x => x.someMethod())
您要为源中可能出现的nulls / undefined返回一些默认值。不幸的是,似乎没有办法简洁地做到这一点,你必须为可能的空值提供安全包装:
source.map(x => invoke(x, func))
其中invoke
类似于return x === null ? null : func.apply(x)
完整示例:
let isNull = x => x === null || typeof x === 'undefined';
let invoke = (func, ...args) => x => isNull(x) ? null : func.apply(x, args);
a = ['foo', 'bar', null, 'bbaazz'];
// z = a.map(x => x.indexOf('a')) // this will fail
z = a.map(invoke(''.indexOf, 'a')); // this works
console.log(z);
&#13;