我使用以下逻辑来获取给定键的 i18n 字符串。
export function i18n(key) {
if (entries.hasOwnProperty(key)) {
return entries[key];
} else if (typeof (Canadarm) !== 'undefined') {
try {
throw Error();
} catch (e) {
Canadarm.error(entries['dataBuildI18nString'] + key, e);
}
}
return entries[key];
}
我在我的项目中使用 ESLint。我收到以下错误:
不要从目标对象访问 Object.prototype 方法“hasOwnProperty”。 这是一个“no-prototype-builtins”错误。
如何更改代码来解决此错误?我不想禁用此规则。
您可以通过
Object.prototype
访问它:
Object.prototype.hasOwnProperty.call(obj, prop);
那应该更安全,因为
Object.prototype
Object.prototype
的对象,hasOwnProperty
方法也可能被其他东西遮盖。当然,上面的代码假设
Object
尚未被遮蔽或重新定义Object.prototype.hasOwnProperty
尚未被重新定义call
自有财产 Object.prototype.hasOwnProperty
Function.prototype.call
尚未被重新定义如果其中任何一个不成立,尝试以更安全的方式编码,您可能会破坏您的代码!
另一种不需要
call
的方法是
!!Object.getOwnPropertyDescriptor(obj, prop);
对于您的具体情况,以下示例适用:
if(Object.prototype.hasOwnProperty.call(entries, "key")) {
//rest of the code
}
或
if(Object.prototype.isPrototypeOf.call(entries, key)) {
//rest of the code
}
或
if({}.propertyIsEnumerable.call(entries, "key")) {
//rest of the code
}
看来这也行得通:
key in entries
因为这将返回一个布尔值来判断该键是否存在于对象内部?
@口头回答正确
使用这个:
Object.prototype.hasOwnProperty.call(object, "objectProperty");
为了使代码更优雅,可以采用polyfill的形式:
if (!Object.hasOwn) {
Object.prototype.hasOwn = function (object, property) {
return Object.prototype.hasOwnProperty.call(object, property);
}
}
console.log(Object.hasOwn({test: 1}, 'test'), Object.hasOwn({tes: 1}, 'test'))
这对我有用,所以尝试一下
let bug={
name:"test"
}
if (bug && typeof bug === 'object' && Object.prototype.hasOwnProperty.call(bug, name)) {
}
function hasOwnProperty<X, Y extends PropertyKey>(
obj: X,
prop: Y
): obj is X & Record<Y, unknown> {
return typeof obj === 'object' && obj !== null && Object.hasOwnProperty.call(obj, prop)
}