hasownproperty 是判断对象自身是否拥有某属性的可靠方法,用于条件拷贝可精准排除原型链属性;它比 in 和 undefined 判断更准确,因 in 检查原型链,而 undefined 判断无法区分属性值为 undefined 与属性不存在。

在 JavaScript 中,hasOwnProperty 是判断对象自身是否拥有某个属性(而非继承自原型链)的可靠方法。利用它做条件拷贝,能精准控制哪些属性被复制,避免意外拷贝原型上的方法或不可枚举属性。
为什么用 hasOwnProperty 而不是 in 或 undefined 判断?
in 操作符会检查原型链,obj.prop !== undefined 无法区分属性值为 undefined 和属性根本不存在的情况。而 hasOwnProperty 只关心对象自身的可枚举属性,语义明确、行为稳定。
例如:
const parent = { name: 'Parent', toString: function() {} };
const child = Object.create(parent);
child.id = 123;
// ✅ 只拷贝 child 自身的 id
// ❌ 不会拷贝 name 或 toString(它们在原型上)
基础条件拷贝:只复制自有属性
遍历源对象的自有属性,逐个检查并赋值到目标对象:
- 使用
Object.keys()获取所有自身可枚举属性名(已隐含hasOwnProperty行为) - 若需更严格控制(比如兼容 for...in + hasOwnProperty 的老写法),可显式调用
- 注意:
Object.keys()不包含不可枚举属性;如需包含,改用Object.getOwnPropertyNames()
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function copyOwnProps(src, target = {}) {
for (const key in src) {
if (src.hasOwnProperty(key)) {
target[key] = src[key];
}
}
return target;
}
进阶:按类型或规则过滤的条件拷贝
结合 hasOwnProperty 和其他判断,实现更灵活的拷贝逻辑:
- 只拷贝字符串类型的自有属性:
typeof src[key] === 'string' - 排除特定键名:
!['__internal', 'meta'].includes(key) - 只拷贝非函数属性:
typeof src[key] !== 'function' - 配合
Object.defineProperty保留属性描述符(如writable、enumerable)时,必须用Object.getOwnPropertyDescriptors(),此时hasOwnProperty仍可用于初步筛选
注意事项与常见陷阱
hasOwnProperty 本身是 Object.prototype 上的方法,若对象自身重写了该方法(极少见但可能),直接调用会出错。稳妥写法是:
Object.prototype.hasOwnProperty.call(obj, key)
另外,ES6+ 中推荐优先使用 Object.keys() 或 Object.entries(),它们内部已保证只处理自有可枚举属性,语义更清晰、性能更好。只有在需要兼容老旧环境或明确需区分可枚举性时,才显式依赖 hasOwnProperty。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










