Skip to main content

hasOwnProperty()

语法

hasOwnProperty(v: PropertyKey): boolean;

描述

用来判断一个对象本身是否含有该属性,返回一个 Boolean 值。

  • 原型链上的属性 一律返回 false

  • Symbol 类型的属性也可以被检测

示例

const age = Symbol("age");

const obj = {
firstName: "yancey",
[age]: "18",
greeting() {
return `Hello, ${this.firstName}!`;
}
};

obj.__proto__ = {
other: "something..."
};

// 修改属性描述符不影响该方法的使用
Object.defineProperties(obj, {
firstName: {
get() {
return "Yancey";
}
},
lastName: {
value: "leo",
configurable: false,
writable: false,
enumerable: false
}
});

obj.hasOwnProperty("firstName"); // true

obj.hasOwnProperty("lastName"); // true

// 不存在的属性返回 false
obj.hasOwnProperty("你xx"); // false

// Symbol类型的属性也可以被检测到
obj.hasOwnProperty(age); // true

obj.hasOwnProperty("greeting"); // true

// 继承属性返回 false
obj.hasOwnProperty("other"); // false

// 而 in 运算符可以获取到继承属性
"other" in obj; // true

扩展

JavaScript 并没有保护 hasOwnProperty 属性名,因此某个对象是有可能存在使用这个属性名的属性,所以我们需要获取 原型链上真正的 hasOwnProperty 方法

const foo = {
hasOwnProperty: function() {
return false;
},
bar: "Here be dragons"
};

foo.hasOwnProperty("bar"); // 始终返回 false

// 如果担心这种情况,可以直接使用原型链上真正的 hasOwnProperty 方法
{}.hasOwnProperty.call(foo, "bar"); // true

// 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(foo, "bar"); // true