You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中new Object()创建的对象是否继承自Object?

关于new Object()和{}创建对象的继承问题解答

核心结论

用var result = new Object();和var result = {};创建的对象都是Object的实例,完全继承自Object.prototype,你的测试结果看起来"异常"是因为对API的使用理解有误,以及对原型链的终点特性不熟悉。

逐个解释你的测试结果

  1. Object.isPrototypeOf(result)返回false
    isPrototypeOf()方法的作用是判断某个原型对象是否存在于目标对象的原型链上,但你调用的是构造函数Object的这个方法,而Object本身是函数,不是原型对象。正确的用法应该是调用Object.prototype.isPrototypeOf(result),这会返回true,因为result的原型链顶端就是Object.prototype。

    代码验证:

    var result = {};
    console.log(Object.prototype.isPrototypeOf(result)); // true
    console.log(Object.isPrototypeOf(result)); // false
    
  2. Object.getPrototypeOf(result)能获取对象原型
    这个结果是正常的,Object.getPrototypeOf(result)返回的就是Object.prototype,这直接证明了result的原型是Object.prototype,也就是继承自它。

  3. result.__proto__返回原型方法,result.__proto__.__proto__为null
    result.__proto__等价于Object.prototype,而Object.prototype是JavaScript原型链的终点,它的原型就是null,这是语言规范规定的正常现象,不是异常。你能通过result直接调用toString()、hasOwnProperty()这些方法,就是因为继承了Object.prototype上的属性。

针对你的疑问的明确回答

  • 该对象是否继承自Object?
    是。这两种方式创建的对象都是Object构造函数的实例,原型链指向Object.prototype,完全继承了该原型上的所有属性和方法。

  • 若未继承,如何让其访问Object原型属性?
    如果你真的创建了一个不继承Object.prototype的对象(比如用var obj = Object.create(null)),要让它访问Object.prototype的属性,可以通过以下方式:

    • 用call/apply调用原型方法:Object.prototype.toString.call(obj)
    • 设置对象的原型为Object.prototype:Object.setPrototypeOf(obj, Object.prototype)
    • 手动混入属性:Object.assign(obj, Object.prototype)(注意会把原型属性复制到对象自身,不是继承)
  • 若继承,为何返回这些异常结果?
    所谓的"异常"都是误解:

    • Object.isPrototypeOf(result)返回false是因为调用对象错误,应该用Object.prototype而非Object构造函数;
    • result.__proto__.__proto__为null是原型链的正常终点,符合JavaScript语言规范。

内容的提问来源于stack exchange,提问作者Supraja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:15:36