gpt4 book ai didi

javascript - obj.hasOwnProperty() 和 Object.prototype.hasOwnProperty.call() 有什么区别?

转载 作者:行者123 更新时间:2023-12-01 15:42:06 39 4
gpt4 key购买 nike

代码一:

obj.hasOwnProperty(prop);

代码二:
const hasOwnProperty = Object.prototype;
hasOwnProperty.call(obj, prop);

我一直使用第一种编码风格,但在一些 JS 书籍或 github 项目中我多次看到关于第二种编码风格。
我想知道这只是一种习惯,或者真的是一种更好的方式来编写我的 js 代码。
谢谢。

最佳答案

如果 obj没有被篡改,差别比较小。但是,如果您依赖 obj,那么各种各样的东西都会妨碍您。包含您期望它工作的原型(prototype)函数(甚至可能是偶然的)。这就是为什么你会经常看到库直接调用原型(prototype)方法,而不是依赖于它们对单个对象的完整调用。

考虑这种情况:

const prop = 'test';

obj = {test: 'example'};
console.log({
'version': 'no tampering!',
'obj.hasOwnProperty': obj.hasOwnProperty(prop),
'Object.prototype.hasOwnProperty': Object.prototype.hasOwnProperty.call(obj, prop)
});

// someone does something you don't expect with obj
obj.hasOwnProperty = () => false;
// NOTE: This at least is a function, there is nothing to stop me from setting it to something that would BREAK the function call...
// E.g. obj.hasOwnProperty = 42;

console.log({
'version': 'some tampering!',
'obj.hasOwnProperty': obj.hasOwnProperty(prop),
'Object.prototype.hasOwnProperty': Object.prototype.hasOwnProperty.call(obj, prop)
});


或者,如果 obj是一个不继承 Object 的对象原型(prototype)?

const obj =  Object.create(null);

console.log(obj.hasOwnProperty);

关于javascript - obj.hasOwnProperty() 和 Object.prototype.hasOwnProperty.call() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62186464/

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