前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库对象方法简写与普通函数属性区别
JavaScript函数与作用域

对象里写 fn() {} 和 fn: function () {} 有区别吗?

日常调用时两者没区别,this 都由调用方式决定,也都有自己的 arguments。区别只有两点:简写方法里可以用 super 调用原型上的同名方法,function 写法里写 super 是语法错误;简写方法没有 prototype,不能被 new。

前端进阶之旅 · 一题精讲更新于 2026.09.29
JavaScript#函数与作用域
先看核心答案读代码示例
理解线索

两种写法差在哪

  1. super简写方法会记住自己定义在哪个对象上,super 从这个对象的原型开始找
  2. 构造能力function 写法有 prototype,可以 new;简写方法不行
  3. this 与 arguments两者都是普通函数规则,obj.fn() 调用时 this 是 obj

简写方法记住的「定义在哪个对象上」不会随 this 变化。把方法复制到别的对象上,super 还是从原来那个对象的原型开始找。

核心回答

先记住这个答案

fn() {} 是 ES6 的方法简写,和 fn: function () {} 在调用时的表现一样:obj.fn() 调用时 this 都是 obj,都有自己的 arguments,单独拿出来调用都会丢 this。真正的区别有两个。第一,简写方法里可以用 super.xxx() 调用原型对象上的方法,function 写法里用 super 会直接报语法错误。第二,简写方法没有 prototype 属性,不能当构造函数,new obj.fn() 会抛 TypeError,而 function 写法可以。

  • this 和 arguments 规则两者一样
  • 只有简写方法里能用 super
  • 简写方法没有 prototype,不能 new
  • 箭头函数属性才是真正没有自己 this 的写法

用代码对比 super 和 new

让对象继承一个 base,两种写法各写一个方法,再分别试试 new。

两种写法放在同一个对象里JavaScript
const base = {
  greet() {
    return 'base'
  }
}
const obj = {
  short() {
    return `${super.greet()} + short` // 简写方法里可以用 super
  },
  long: function () {
    return 'long' // 这里写 super 会报语法错误
  }
}
Object.setPrototypeOf(obj, base)

console.log(obj.short())
console.log(obj.short.prototype, typeof obj.long.prototype)
try {
  new obj.short()
} catch (err) {
  console.log(err.name)
}
查看输出与解释
base + short
undefined object
TypeError

short 里的 super.greet() 找到了 base 上的 greet。short 没有 prototype,long 有,因为 long 是一个完整的普通函数,理论上可以当构造函数用。new obj.short() 直接抛 TypeError。

super 为什么只在简写方法里能用

super 需要知道「从哪个对象的原型开始找」。简写方法在创建时会记下自己定义在哪个对象上,规范里叫 [[HomeObject]],super.greet 就是去这个对象的原型上找 greet。fn: function () {} 只是把一个普通函数赋给属性,函数本身不知道自己属于哪个对象,所以引擎在解析阶段就不允许里面出现 super。class 里的方法也是方法定义,所以同样能用 super。

复制方法后 super 不跟着变
把 obj.short 赋给另一个对象 other.short = obj.short 再调用,this 变成了 other,但 super 仍然从 obj 的原型,也就是 base 开始找。这种 this 和 super 指向不同对象的情况很难读,实际代码里要避免把用了 super 的方法到处复制。

和箭头函数属性别搞混

还有第三种写法 fn: () => {},它和前两种都不一样。箭头函数没有自己的 this,用的是定义对象字面量时外层的 this,通常是模块顶层的 undefined 或者 window,而不是这个对象。所以对象方法需要用 this 读对象上的数据时,只能用简写方法或 function 写法,不能用箭头函数。

回答前,多想一步

容易答错的地方

以为简写方法的 this 是固定的
简写方法只是语法更短,this 规则和普通函数完全一样。const f = obj.short 再调用 f(),this 一样会丢,作为事件回调传出去也要 bind 或者包一层箭头函数。
以为简写方法没有 arguments
没有 arguments 的是箭头函数。简写方法是普通方法,有自己的 arguments。
试着用自己的话回答

面试官还会怎么问?

Vue 选项式 API 里 methods 为什么不能写箭头函数?

Vue 会把 methods 里的函数的 this 绑定到组件实例上。简写方法和 function 写法都能被绑定,箭头函数的 this 在定义时就定死了,绑定不上去,里面的 this 读不到组件数据。

getter 和 setter 算方法简写吗?

算,get size() {} 和 set size(v) {} 都是方法定义,里面同样能用 super,也同样不能 new。

两种写法在属性描述符上有区别吗?

没有。两者都是普通的数据属性,可写、可枚举、可配置,Object.keys 都能列出来。这一点和 class 里的方法不同,class 的方法定义在原型上,而且不可枚举。

从一道题,走向一组知识

把知识连起来

函数与作用域

obj.fn?.() 怎么用?用可选链调用方法,this 会丢吗?

obj.method?.() 调用时 this 仍然是 obj,和这里讲的方法调用规则是一回事。

函数与作用域

怎么用闭包实现私有变量?有哪几种写法?

闭包工厂返回的对象通常用方法简写定义接口,方法不依赖 this,解构出来也能用。

参考资料

  • JavaScript:函数与作用域参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 用代码对比 super 和 new
  3. super 为什么只在简写方法里能用
  4. 和箭头函数属性别搞混
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑