Javascript 为什么elem.hasOwnProperty()为false

Javascript 为什么elem.hasOwnProperty()为false,javascript,properties,event-handling,click,Javascript,Properties,Event Handling,Click,我有一个点击处理器 e.addEventListener('click', this.Multiply, false); 和一个函数 this.Multiply = function () { APi.Multiply(this); }; 和简单的选择元素。 这就是Select元素 为什么要跑 this.selectedIndex 给出值=>2 但是运行this.getOwnPropertyNames()会抛出错误 或者this.hasOwnProperty('selectedI

我有一个点击处理器

e.addEventListener('click', this.Multiply, false);
和一个函数

this.Multiply = function () {
    APi.Multiply(this);
};
和简单的选择元素。
这就是Select元素

为什么要跑

this.selectedIndex 
给出值=>2

但是运行
this.getOwnPropertyNames()
会抛出错误


或者
this.hasOwnProperty('selectedIndex')
->给出false

这是因为selectedIndex实际上是HTMLSelectElement原型上的属性,而不是实例属性。要按您的意愿进行测试,您可以尝试以下方法:

this.__proto__.hasOwnProperty('selectedIndex');

你应该得到你期望的结果

当然,这假定
这个
的实例实际上是您选择的元素。当然,考虑到这个HTML:

<select id="example"></select>

会在控制台上打印true。

我刚刚遇到一个问题,在chrome事件中。hasOwnProperty('data')->给出true,在FF事件中。hasOwnProperty('data')->false,这与PostMessage中的事件相同。原因是什么?如果你模拟一个小提琴,我可以在chrome和firefox中打开它来演示你的问题,我很乐意帮你看看。这个JSFIDLE我只需要从控制台运行事件侦听器功能。然后从iframe作用域运行postmessage和event.hasOwnProperty(数据)结果在browsersHmm中不同,这在@vickk中非常奇怪。Firefox似乎将数据定义为MessageEvent原型的一部分。我猜正是因为这个原因,hasOwnProperty失败了,因为它希望你看到原型。Chrome似乎并没有在这个问题上施加压力。你可以花点时间在谷歌上搜索,找出问题的症结所在,然后找到一个优雅的解决方案。或者,如果您只想在两种浏览器中快速修复,您可以将测试从单个hasOwnProperty更改为
(event.u proto_uu.hasOwnProperty('data')| event.hasOwnProperty('data'))
<select id="example"></select>
var el = document.getElementById("example");
console.log(el.__proto__.hasOwnProperty('selectedIndex'));