问题标签 [hasownproperty]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - hasOwnProperty 在检查父对象属性时返回 true
我的 JavaScript 代码:
我有两个对象(BaseClass 和 SubClass)。一个使用构造函数模式从另一个继承,如MDN 中所述。
现在,当我遍历子类对象的所有属性时,它们都为 hasOwnProperty 返回 true,即使对于父方法/属性,除了构造函数。
这是否意味着在使用构造函数模式时它会中断?
当我将公共属性和方法放在构造函数中时,无论是在 BaseClass 还是 SubClass 中,它们都将始终被“标记”为自己的属性/方法。当我将它们附加到各自的原型时,hasOwnProperty 将为它们输出“false”。
无论您将公共方法/属性放在原型还是构造函数本身,它们都可以在子类中使用(--> SubClass2,--> SubClass3)。
我现在唯一能想到的,为什么要将它们附加到原型对象上,是出于效率原因,正如此处“定义类方法”部分所述。为了不为每个构造的实例添加闭包。
值类型应该在原型上声明,但不是实例变量,其初始值取决于构造函数的参数或构造时的其他状态。无论它们的声明位置如何,您都可以覆盖这两个属性/函数。
同样在原型上设置 getter 和 setter,例如设置或获取私有变量,是没有意义的,因为私有变量必须是公共的,以便附加到原型的 getter 和 setter 可以访问。
因此,使用 getter 和 setter 是没有意义的。您可以直接访问公共变量。
我现在必须稍微调整一下我的问题:
我什么时候需要hasOwnProperty,如果实际上应该在原型上声明公共道具/函数,这反过来将全部输出Object.hasOwnProperty(obj,"prop/func") --> false。给我一个用例,在有意义的时候使用 hasOwnProperty。
解决方案
当我问这个问题时,我认为在 JavaScript 中使用经典继承时,我可以使用 hasOwnProperty 区分我的子类的哪些属性/函数直接属于它。这是不可能的,因为父原型的所有属性/功能都被复制到子类的原型中:
使用 hasOwnProperty 时,附加到原型的所有属性/函数都返回“false”。
如果您在 BaseClass 和 SubClass 的构造函数中声明了公共属性/函数,则在为子类上的这些属性调用 hasOwnProperty 时,所有这些属性都会返回“true”。
使用以下语句将这些复制到子类:
因此,在迭代 SubClass 类型的 obj 的所有属性时使用 hasOwnProperty,将对原型级别声明的所有属性/函数输出 false,对构造函数级别声明的所有属性/函数输出 true。
现在,我明白了为什么在这个用例中使用 hasOwnProperty 是没有意义的。
jquery - 对象 - 检查字段是否存在
我有一个带有以下标记的对象:
我想检查例如字段 10/12/2015 是否存在 - 如果存在我想加载该字段持有的数组,如果不为该字段创建新的空数组。
我尝试了这段代码,但每次都会出错,即使字段不存在:
如果 JSFiddle 在这里:
javascript - JavaScript:为什么 Object.hasOwnProperty 方法的行为是这样的?
我的理解是该Object.hasOwnProperty
方法检查对象是否具有它自己的属性名称,即非继承属性。这意味着该函数应该在属性a 时返回 false。不存在,或者b. 如果是遗传的。
如果我错了,请纠正我,但除非这不使用经典继承,否则不会bar
从Foo
下面的代码中继承?当属性是继承属性时,为什么该hasOwnProperty
方法返回 true ?propname
我在这里做错了什么?
另外,我将如何hasOwnProperty
在Foo
对象上使用?此处的代码在false
检查Foo
对象时返回。
javascript - 首先检查 Object.prototype 时可以跳过 hasOwnProperty() 吗?
我们应该hasOwnProperty()
在迭代对象的键时使用,因为Object.prototype
可能会被污染,通过原型继承,也会污染所有对象的键。
因此,如果我不污染Object.prototype
,我应该能够跳过hasOwnProperty()
减慢for-in 循环的过程。它还将使代码更简单。
思路:先检查Object.prototype
没有污染,再不要使用hasOwnProperty()
。
未污染的检查Object.prototype
由以下功能完成。我将在我的代码中的一个战略位置调用它,它在脚本执行期间偶尔执行(就像在我要处理一堆数据之前)。如果对以下方面做了任何不好的事情,此功能只是提醒我Object.prototype
:
注意:我/* jshint -W089 */
发表评论是为了让 jshint 不会抱怨缺少hasOwnProperty()
.
问:这样可以吗?还有什么我应该注意的吗?或者我可以改进?
现在一些基准:
以下是 3 个 jsPerf 基准测试,它们显示了具有不同属性数量的对象的增益:
- 1 个属性:使用 1 个属性迭代普通对象的自己的键
- 10 个属性:用 10 个属性迭代普通对象的自己的键
- 100 个属性:迭代具有 100 个属性的普通对象的自己的键
注意:Object.prototype
每次迭代对象的属性时都会执行检查。在实际情况下,测试只需要执行一次:当整个页面加载时(然后不时确保没有脚本被无意修改Object.prototype
)。因此,在实际情况下,您将获得“参考”测试的性能。但这表明,即使总是执行测试,它也保持得更快。
有趣的结果:
- 不使用
hasOwnProperty()
任何一个都可以提供相同的速度或更快,具体取决于浏览器 - 即使仅访问 1 个属性,
Object.protoype
在某些浏览器中,在每个 for-in 循环之前检查也可能比hasOwnProperty()
! (但我不建议总是这样检查Object.prototype
)
相关:我们还看到,Object.keys()
在某些浏览器中,对于大对象的使用速度可能更快,但对于小对象,它也可能更慢。但是使用Object.keys()
会迫使您要么只支持浏览器 >= IE 9,要么在 IE <= 8 中Object.prototype
添加一个polyfill。因此,为了与旧浏览器兼容,您必须选择Object.keys()
或checkObjectPrototypeNotAugmented()
。
angularjs - angularjs选择显示未过滤的选择
我遇到了以下我觉得很奇怪的事情。我没有被它阻止,但很好奇是否有人知道。当我将 hasOwnProperty 与选择选项一起使用时,它会显示一个不在下拉列表中的值(A2F0C7)。。有人可以分享为什么会这样吗?这是jsfiddle:
http://jsfiddle.net/stampyNY/2oeo8of9/1/
谢谢你!
javascript - 与 for...in 相比,如何修复 Object.keys() 中缺少的键和 hasOwnProperty()
在某些浏览器中,Object.keys()
不会返回所有for-in 循环并hasOwnProperty()
返回的键。
是否有不使用 for-in 循环的解决方法?
是否还有另一个对象window
表现出相同的错误,或者它只是window
对象的问题,因为我的测试倾向于显示?
澄清
两者都应该只返回自己的和唯一的可枚举属性,正如我们可以从文档中看到的那样:
- for-in 循环
hasOwnProperty()
:“ for...in 循环仅迭代可枚举的属性。 ”并hasOwnProperty()
从原型链中过滤掉继承的属性,只保留自己的属性。 Object.keys()
: "要返回其可枚举的自身属性的对象。 "
结论:它们应该迭代相同的键:仅可枚举和拥有的属性。
浏览器结果
Firefox 39:没有丢失的密钥
Chromium 38:47 个缺失键:
- Safari 5.1:缺少 37 个键:
- Safari 14:没有丢失的密钥
测试脚本
javascript - 事件对象上的 Javascript hasOwnProperty 总是错误的?
我希望有人可以帮助澄清与事件对象相关的 hasOwnProperty() 方法。
我正在尝试克隆鼠标事件(最终此对象将传递给 iframe) 我已经构建了一个“克隆”功能 - 但每当我尝试克隆一个窗口事件(即滚动、单击等)时,所有“hasOwnProperty”实例()' 返回假。例如,我遍历对象 - 使用 hasOwnProperty() 来检查 - 每个属性都返回 false。这适用于标准对象 - 但不适用于事件对象。
这是因为事件对象中的所有属性都是继承的吗?还是代码有问题?
任何启示将不胜感激:)
代码片段:
javascript - 战斗:hasOwnProperty vs obj.prop
我看过一些专门的帖子,hasOwnProperty
但我仍然质疑是否(以及何时)应该在简单的obj.prop
if (obj.hasOwnProperty("prop"))
对于检查对象是否定义了非继承属性很有用,prop
但这是否比简单地做更好if (obj.prop)
?
当您有嵌套对象时,梯子特别有用。例如,如果您有一个对象,该对象superheros
具有 的属性,dcComics
并且在该属性内具有batman
要检查是否设置了 batman,hasOwnProperty
您必须:
if (superheros.hasOwnProperty("dcComics") && superheros.dcComics.hasOwnProperty("batman") {...}
使用简单的道具检查:
if (superheros.dcComics && superheros.dcComics.batman)
在大多数情况下,当您不定义自己的 js 对象时,只使用 js 是否可以接受obj.prop
?
javascript - 如何检查变量是否是开发人员定义的没有自己属性的对象?
在我的代码中,有一个变量有时是以下变量之一:
- 一个号码,
- 一个布尔值,
- 一个字符串,
- 一个正则表达式,
- 一个约会,
- 具有 0 个或多个“自己的”属性的对象。
我想检查该变量是否是“基本对象”。我将“基本对象”定义为:
- 一个号码,
- 一个布尔值,
- 一个字符串,
- 一个正则表达式,
- 一个约会,
或者,换句话说,一个没有开发人员定义的“自己的”属性的对象。
我使用了条件Object.getOwnPropertyNames(obj).length === 0
,但是字符串(根据上面的定义,是“基本对象”)对于每个字符和字符串的长度都有“自己的”属性。例如,如果我Object.getOwnPropertyNames("test")
在 Ubuntu 15.10 上的 Chrome(46.0.2490.86(64 位)DevTools 控制台和 Ubuntu 15.10 上的 Firefox 42 中运行,它会打印["0", "1", "2", "3", "length"]
(在 Chrome 中)和[ "length", "0", "1", "2", "3" ]
(在 Firefox 中)。
那么,检查变量是否为“基本对象”的最易读的方法是什么?我对性能不感兴趣,但对可读性和调试的容易性感兴趣。
非常感谢!:-)
更新:
我开始使用这个功能,虽然我希望有人能给我一个与新类型兼容的解决方案而不做任何改变。
javascript - 测试自己的属性的晦涩方法
在本书 Javascript:David Flanagan 的权威指南第六版第 147 页中,作者讨论了使用 for..in 循环遍历数组时的警告,以下是引用(粗体是我的)
...因此,您不应在数组上使用 for/in 循环,除非您包含额外的测试来过滤掉不需要的属性。 您可以使用以下任一测试:
现在第一个代码片段对我来说很清楚,继承的属性将被跳过。
但是,我根本不清楚第二个代码片段。
据我了解,第二个代码片段将跳过数组的任何非数字属性(无论它是否是自己的属性(与第一个代码片段不同))
但如果是这样的话,你不能只使用一个简化的测试,比如:
那么作者为什么要用这么复杂的表达方式呢?
我在这里错过了什么吗?