如何正确使用 JavaScript 中的 new 命令?

基本用法

new命令的作用,就是执行构造函数,返回一个实例对象。

new命令本身就可以执行构造函数,所以后面的构造函数可以带括号,也可以不带括号。

csharp 复制代码
// 推荐的写法
var v = new Vehicle();
// 不推荐的写法
var v = new Vehicle;

问题:如果忘了使用 new 命令,直接调用构造函数会发生什么?

答:这种情况下,构造函数就变成了普通函数,并不会生成实例对象。且 this 这时代表全局对象。

ini 复制代码
var Vehicle = function (){
  this.price = 1000;
};

var v = Vehicle();
v // undefined
price // 1000

为了保证构造函数必须与 new 命令一起使用,解决方法是:构造函数内部使用严格模式,即第一行加上 use strict。

另一个解决方法,构造函数内部判断是否使用 new 命令,如果发现没有使用,则直接返回一个实例对象。

javascript 复制代码
function Fubar(foo, bar) {
  if (!(this instanceof Fubar)) {
    return new Fubar(foo, bar);
  }

  this._foo = foo;
  this._bar = bar;
}

Fubar(1, 2)._foo // 1
(new Fubar(1, 2))._foo // 1

new 命令的原理

使用 new 命令时,它后面的函数依次执行下面的步骤。

  1. 创建一个空对象,作为将要返回的对象实例。

  2. 将这个空对象的原型( proto )指向构造函数的 prototype 属性

  3. 将构造函数内部的 this 绑定到新创建的空对象上。

  4. 执行构造函数:将构造函数作为函数调用,传递给新对象以及其他参数。

  5. 如果构造函数返回的是一个对象,则返回该对象;否则,返回新创建的对象。

也就是说,构造函数内部,this 指的是一个新生成的空对象,所有针对 this 的操作,都会发生在这个空对象上。

new命令简化的内部流程,可以用下面的代码表示。

javascript 复制代码
// 构造函数
var Person = function (name, age) {
      this.name = name;
      this.age = age
}

function _new(constructor, ...params) {
    // 创建一个新对象,且原型指向构造函数的原型
    var context = Object.create(constructor.prototype);
    // 执行构造函数
    var result = constructor.apply(context, params);
    // 如果返回结果是对象,就直接返回。否则返回 context 对象
    return result instanceof Object ? result : context;
}
 // 实例
var actor = _new(Person, '张三', 28);
相关推荐
代码匠心19 分钟前
AI 自动编程:一句话设计高颜值博客
前端·ai·ai编程·claude
_AaronWong2 小时前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode2 小时前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441942 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo2 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
恋猫de小郭2 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木2 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮2 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati2 小时前
Vue3 父子组件通信完全指南
前端·面试
是一碗螺丝粉3 小时前
5分钟上手LangChain.js:用DeepSeek给你的App加上AI能力
前端·人工智能·langchain