JavaScript对象原型无法访问:为何a.prototype返回undefined?
为什么字面量对象的
prototype返回undefined? 这个问题其实是混淆了JavaScript里两个极易搞混的概念——构造函数的prototype属性和对象的内部原型([[Prototype]]),我来给你讲明白:
prototype是函数专属的属性
只有函数(尤其是我们用来创建实例的构造函数)才拥有prototype属性。当你用new 构造函数()创建实例时,这个实例的内部原型会自动指向构造函数的prototype对象。但你这里的a是用对象字面量{foo: 1}创建的普通对象,它不是函数,自然没有prototype属性,所以a.prototype返回undefined是完全正常的。普通对象的原型该怎么访问?
每个JavaScript对象(除了Object.create(null)创建的无原型对象)都有一个内部的[[Prototype]]链接,指向它的原型对象。要访问这个内部原型,标准的方法是使用Object.getPrototypeOf():var a = {foo: 1}; console.log(Object.getPrototypeOf(a)); // 输出 Object.prototype另外你可能见过
a.__proto__这种写法,它是浏览器厂商实现的非标准属性(现在虽被纳入ES6但仍不推荐),本质上是Object.getPrototypeOf()的语法糖。
举个对比例子更清晰:
// 构造函数拥有prototype属性 function Person() {} console.log(Person.prototype); // 输出带有constructor属性的对象 // 构造函数的实例没有prototype,但内部原型指向构造函数的prototype const person = new Person(); console.log(person.prototype); // undefined console.log(Object.getPrototypeOf(person) === Person.prototype); // true // 字面量对象的情况 const a = {foo: 1}; console.log(a.prototype); // undefined console.log(Object.getPrototypeOf(a) === Object.prototype); // true
简单总结:prototype是用来给构造函数的实例提供原型的属性,只属于函数;而对象自身的原型是内部的[[Prototype]],需要用Object.getPrototypeOf()来访问,别把这两个概念搞混哦!
内容的提问来源于stack exchange,提问作者afdi5
相关产品推荐
相关产品推荐

