Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript obj.hasOwnProperty()和Object.prototype.hasOwnProperty.call()之间有什么区别?_Javascript - Fatal编程技术网

Javascript obj.hasOwnProperty()和Object.prototype.hasOwnProperty.call()之间有什么区别?

Javascript obj.hasOwnProperty()和Object.prototype.hasOwnProperty.call()之间有什么区别?,javascript,Javascript,代码一: obj.hasOwnProperty(prop); 代码二: const hasOwnProperty = Object.prototype; hasOwnProperty.call(obj, prop); 我总是使用第一种编码风格,但我在一些JS书籍或github项目中多次看到第二种编码风格。 我想知道这只是一种习惯,还是一种更好的编写js代码的方式。 谢谢。如果obj未被篡改,则差异相对较小。但是,如果您依赖于包含原型函数的obj,那么各种各样的东西都可能成为阻碍,因为您期望

代码一:

obj.hasOwnProperty(prop);
代码二:

const hasOwnProperty = Object.prototype;
hasOwnProperty.call(obj, prop); 
我总是使用第一种编码风格,但我在一些JS书籍或github项目中多次看到第二种编码风格。 我想知道这只是一种习惯,还是一种更好的编写js代码的方式。 谢谢。

如果obj未被篡改,则差异相对较小。但是,如果您依赖于包含原型函数的obj,那么各种各样的东西都可能成为阻碍,因为您期望它可能会工作,即使是在偶然的情况下。这就是为什么您经常看到库直接调用原型方法,而不是依赖于它们对单个对象的处理

考虑这种情况:

const prop=‘test’; obj={test:'example'}; console.log{ “版本”:“禁止篡改!”, “obj.hasOwnProperty”:obj.hasOwnPropertyprop, 'Object.prototype.hasOwnProperty':Object.prototype.hasOwnProperty.callobj,prop }; //有人用obj做了你意想不到的事 obj.hasOwnProperty==>false; //注意:这至少是一个函数,没有什么可以阻止我将其设置为会中断函数调用的某个值。。。 //例如,obj.hasOwnProperty=42; console.log{ '版本':'一些篡改!', “obj.hasOwnProperty”:obj.hasOwnPropertyprop, 'Object.prototype.hasOwnProperty':Object.prototype.hasOwnProperty.callobj,prop
};例如,当需要根据ur QUOTE::中的某些条件选择函数时,应该使用函数变量,但我在一些JS书籍或github项目中多次看到第二种编码样式-->是,如果使用ESLint,则它会在obj.hasOwnProperty上抛出错误,因此,您需要使用另一种方法,这可能是开发人员选择第二种方法的原因之一,是的,它出错的原因由公认的答案解释,或者在这里::谢谢。我认为这种样式有助于避免某种类型的判断,但我从未考虑过有人会尝试将属性“hasOwnProperty”或inhiret从null更改为null。。知道了