6

我想检查输入元素是复选框还是文本类型。

我知道我可以这样做:

//Type of input..
if ( input.type === "checkbox" ) 
//Contains the property..
if ( "checked" in input ) 

但我的问题是:为什么hasOwnProperty返回 false?

我只想使用:

input.hasOwnProperty("checked")

但它每次都返回false。

不是input对象吗?
我不这么认为,但typeof说是:

typeof input // returns "object" 

那么发生了什么?!

代码示例:

const input = document.querySelector("input")
 if ( input instanceof HTMLInputElement ) {
    console.dir(input);
    console.info(typeof input);
    console.log("with 'hasOwnProperty'",input.hasOwnProperty("checked"));
    console.log("with 'in'","checked" in input);
    console.log("with 'type'",input.type === "checkbox");
}
<input type="checkbox" />

关于 HTMLInputElement 的文档,只有类型 checkbox 具有以下属性checked

4

1 回答 1

5

"checked" in input返回true,因为in评估所有可枚举的属性。相反,只有当属性是对象本身的成员时.hasOwnProperty()才会返回。如果它是继承的或对象的成员,则true返回。falseprototype

在这种情况下,checked是 的吸气剂HTMLInputElement.prototype不是的成员input

const checkbox = document.getElementById("c");
const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'checked');

console.log("'checked' is property of input:", "checked" in checkbox);
console.log("'checked' is own-property of input:", checkbox.hasOwnProperty("checked"));
console.log("'checked' is member of prototype:", HTMLInputElement.prototype.hasOwnProperty("checked"));
console.log("'checked' is getter:", descriptor.get !== undefined);
<input type="checkbox" id="c">

于 2019-11-04T15:59:05.537 回答