面试必考!一招教你区分JavaScript静态函数和普通函数,快收藏!

一、普通函数 VS 静态函数,本质区别是什么?

我们从一个代码段开始:

js 复制代码
class User {
  hello() { console.log('hello'); }        // 普通方法(实例方法)
  static bye() { console.log('bye'); }     // 静态方法
}

区别:

类型 定义方式 调用方式 this指向
普通方法 不加static 实例对象.方法() 实例对象
静态方法 static修饰 类名.方法() 类本身

演示:

js 复制代码
const u = new User();
u.hello();      // hello
User.bye();     // bye

User.hello();   // 报错
u.bye();        // 报错

二、面试官会怎么考你?

面试官:如何用代码判断某个方法是静态方法还是普通方法?

很多人的答案是:

看有没有 static 关键字!

错!

正如你拿到三方库的源码或通过反射获取类属性时,根本不会出现 static 这个字眼。你拿的只是一个函数,你怎么判断它的类型?


三、绝招:用方法"挂载的位置"一秒区分

静态方法和普通方法的本质区别是什么?

答:它们的挂载位置不同!

  • 静态方法挂载在 类本身("构造函数"对象)上
  • 普通方法 挂载在 类的原型(prototype)上

代码验证

js 复制代码
console.log(User.bye);                // Function: bye
console.log(User.prototype.hello);    // Function: hello

console.log(User.hello);              // undefined
console.log(User.prototype.bye);      // undefined

四、实用函数,一键判断方法类型!

人生苦短,直接上代码:

js 复制代码
function isStaticMethod(cls, methodName) {
  return typeof cls[methodName] === 'function' &&
         typeof cls.prototype[methodName] !== 'function';
}

function isInstanceMethod(cls, methodName) {
  return typeof cls.prototype[methodName] === 'function' &&
         typeof cls[methodName] !== 'function';
}

测试一下:

js 复制代码
class Hero {
  fight() {}            // 普通方法
  static revive() {}    // 静态方法
}

console.log(isStaticMethod(Hero, 'fight'));    // false
console.log(isStaticMethod(Hero, 'revive'));   // true
console.log(isInstanceMethod(Hero, 'fight'));  // true
console.log(isInstanceMethod(Hero, 'revive')); // false

是不是超级丝滑!


五、进阶:属性描述符一眼就分辨

利用 Object.getOwnPropertyDescriptor 也能一秒区分:

js 复制代码
console.log(Object.getOwnPropertyDescriptor(Hero, 'revive'));         // 有值
console.log(Object.getOwnPropertyDescriptor(Hero.prototype, 'revive'));// undefined

哪些方法只有对象本身有?静态!

只能通过 prototype 访问到?普通方法!


六、面试亮点加分(原理深入)

1. 静态方法不被继承给实例

js 复制代码
const h = new Hero();
console.log(h.revive); // undefined

2. prototype 只持有普通方法

js 复制代码
console.log(Hero.prototype); // 只包含 fight

3. 对象字面量没有"静态方法"这种说法

js 复制代码
const obj = {
  foo() {}
}

只有类(class)里的 static 才有静态方法!


七、彩蛋:ES5、ES6差异知多少?

ES5没有static关键字,但你可以这样模拟静态方法:

js 复制代码
function Car() {}
Car.run = function() { console.log('run!'); }; // 静态方法
Car.prototype.drive = function() { console.log('drive'); }; // 实例方法

同理,这两种方法的区分还是靠"挂载位置"


最后

如果你觉得有用,记得点赞、收藏、转发给更多小伙伴哦!

相关推荐
JeffongTan4 小时前
在LWC中镶嵌VF Page获取用户IP
前端·javascript·salesforce
不cong明的亚子6 小时前
web live多屏互动平台
javascript·经验分享·音视频
陆枫Larry6 小时前
Astro 是什么
前端
是立不是利8 小时前
写给设计师的 CSS 博客美学指南
前端·css
dsyyyyy11018 小时前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
默_笙8 小时前
🏝 Docker 就是"房地产开发":从施工图纸到小区物业的容器化指南
前端·javascript
计算机魔术师8 小时前
Rohan Paul 谈用时间跨度衡量智能体能力,并引用 OpenAI 自动化研究实习生里程碑
前端
kyriewen8 小时前
我手写了个极简版 React Router——才搞懂 v6 为什么砍了这么多 API
前端·javascript·程序员
a1117769 小时前
Shirone 二次元博客主题 开源
前端·开源
IT_陈寒9 小时前
Python的切片赋值把我坑惨了,这不是bug是特性
前端·人工智能·后端