object.hasown能准确检测实例自有方法属性(含箭头函数),但不检测原型方法;检测静态方法需传入类本身;支持symbol键。

支持,但要注意“类方法属性”具体指哪一层。
检测类实例上的自有方法属性
如果方法是直接定义在实例上(比如在 constructor 里用 this.method = () => {}),那么 Object.hasOwn 能准确检测到:
- 它只看该属性是否直接存在于实例对象自身,和属性值是函数、字符串还是其他类型无关
- 例如:Object.hasOwn(obj, 'handleSubmit') 返回 true,只要 obj.handleSubmit 是 obj 自身的属性(哪怕是个箭头函数)
不检测原型上的类方法
ES6 class 中定义在原型上的方法(如 class X { foo() {} }),默认挂载在 X.prototype 上,属于继承属性,不是实例自身的:
- Object.hasOwn(instance, 'foo') 返回 false —— 这是正常且预期的行为
- 因为 foo 不在 instance 对象内部,而在它的原型链上
- 这和 hasOwnProperty 行为一致,但更可靠(不受原型污染或重写影响)
检测静态方法需传入类本身
类的静态方法属于类构造函数对象自身,不是实例的属性:
- 要检测 MyClass.staticMethod,目标对象应是 MyClass,而不是其实例
- 写法:Object.hasOwn(MyClass, 'staticMethod')
- 前提是该静态方法确实是直接赋值或通过 static 关键字声明的(即存在于 MyClass 对象自身)
Symbol 方法名也支持
无论方法名是字符串还是 Symbol,Object.hasOwn 都能处理:
- const sym = Symbol('run');
- obj[sym] = function() {};
- Object.hasOwn(obj, sym) → true











