繁体   English   中英

用于检查对象中的“构造函数”键的奇怪的javascript行为

[英]Odd javascript behavior for checking “constructor” key in object

我实际上不确定我是不是偶然发现了javascript中的不需要的行为,或者这是否是某种预期的行为。

以下代码生成一个真实的语句:

var test= {"test":1}
document.write("constructor" in test);    

http://jsfiddle.net/xyatxm2g/2/

如果我将其更改为以下代码,它将返回false,因为它应该:

var test= {"test":1}
document.write(test.hasOwnProperty("constructor"));

http://jsfiddle.net/fg06ovvc/2/

正如名称所示, hasOwnProperty方法查看对象以查看它是否具有该属性本身。

但是当你'propertyName' in test使用'propertyName' in test ,你不仅要查看对象自己的属性,还要查看继承中的属性。

在这种情况下, constructor是驻留在Object原型中的属性,因此所有对象都具有该属性,因为它们都从Object继承。

来自MDN的报价

来自Object的每个对象都继承hasOwnProperty方法。 此方法可用于确定对象是否具有指定的属性作为该对象的直接属性; in运算符不同,此方法不会检查对象的原型链。

MDN文档

继承的属性
in运算符为原型链中的属性返回true。
"toString" in {}; // returns true

hasOwnProperty()方法只检查对象上的属性,而不是继承(即不在原型链上)。

在MDN文档之后,它不是可枚举的字段。

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable

您可以执行以下测试:

var obj = {"t": 23};
obj.propertyIsEnumerable("t")

结果:是的

obj.propertyIsEnumerable("constructor")

结果: false

本文档的完整示例见以下部分:

直接与继承属性

我认为这里的正常行为key in object操作符中的key in object正在搜索原型链并为Object.prototype.constructor返回true。 请参阅此讨论 - 它涉及相关主题。

如何检查对象是否在JavaScript中具有属性?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM