JavaScript中new Object()创建的对象是否继承自Object?
new Object()和{}创建对象的继承问题解答 核心结论
用var result = new Object();和var result = {};创建的对象都是Object的实例,完全继承自Object.prototype,你的测试结果看起来"异常"是因为对API的使用理解有误,以及对原型链的终点特性不熟悉。
逐个解释你的测试结果
Object.isPrototypeOf(result)返回falseisPrototypeOf()方法的作用是判断某个原型对象是否存在于目标对象的原型链上,但你调用的是构造函数Object的这个方法,而Object本身是函数,不是原型对象。正确的用法应该是调用Object.prototype.isPrototypeOf(result),这会返回true,因为result的原型链顶端就是Object.prototype。代码验证:
var result = {}; console.log(Object.prototype.isPrototypeOf(result)); // true console.log(Object.isPrototypeOf(result)); // falseObject.getPrototypeOf(result)能获取对象原型
这个结果是正常的,Object.getPrototypeOf(result)返回的就是Object.prototype,这直接证明了result的原型是Object.prototype,也就是继承自它。result.__proto__返回原型方法,result.__proto__.__proto__为nullresult.__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

