能否通过函数本身访问其原型对象?原型属性为何无法直接访问?
能否通过函数本身访问该函数的prototype(原型)对象?
首先直接给结论:你不能直接通过构造函数本身访问其原型对象上的属性——必须明确通过构造函数.prototype的方式来访问原型上的内容,这也是你例子里Fan.speed返回undefined的核心原因。
为什么直接访问会返回undefined?
JavaScript里,构造函数本身是一个独立的函数对象,而它的prototype是另一个完全独立的对象。这两个对象的属性存储空间是完全分开的:
- 当你写
Fan.prototype.speed='high'时,你是把speed属性添加到了Fan.prototype这个对象上,而非Fan函数自身。 - 当你尝试访问
Fan.speed时,JavaScript会直接去查找Fan这个函数对象自身的属性,找不到自然就返回undefined。
举个更直观的例子帮你理解:
function Fan(){} // 给原型对象添加属性 Fan.prototype.speed='high'; // 给函数自身添加属性 Fan.color='blue'; console.log(Fan.speed); // undefined —— 函数自身没有这个属性 console.log(Fan.prototype.speed); // 'high' —— 明确访问原型对象的属性 console.log(Fan.color); // 'blue' —— 函数自身的属性可以直接访问
那怎么正确访问原型上的属性?
有两种常见的正确方式:
- 直接通过构造函数的prototype属性访问:就像上面的
Fan.prototype.speed,这是最直接的方式。 - 通过构造函数的实例访问:当你用
new Fan()创建实例时,实例会继承原型对象的属性,JavaScript会通过原型链向上查找对应的属性:
const myFan = new Fan(); console.log(myFan.speed); // 'high' —— 实例通过原型链找到原型上的属性
补充:关于Something.name的小误区
你例子里提到Something.name输出undefined,其实这里可能存在小误解——JavaScript函数本身自带一个name属性,默认值就是函数的名称:
function Something(){} console.log(Something.name); // 会输出'Something',而非undefined
如果你的代码里返回了undefined,大概率是你手动给Something函数自身设置了name为undefined,或者运行环境有特殊情况,但这和原型对象的name属性是完全两回事哦。
内容的提问来源于stack exchange,提问作者ponmani venkat
相关产品推荐
相关产品推荐

