如何正确使用 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);
相关推荐
这是个栗子几秒前
AI辅助编程(一) - ChatGPT
前端·vue.js·人工智能·chatgpt
2501_944448001 分钟前
Flutter for OpenHarmony衣橱管家App实战:预算管理实现
前端·javascript·flutter
Remember_9934 分钟前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
笨蛋不要掉眼泪7 分钟前
Redis持久化解析:RDB和AOF的对比
前端·javascript·redis
心.c9 分钟前
Vue3+Node.js实现文件上传分片上传和断点续传【详细教程】
前端·javascript·vue.js·算法·node.js·哈希算法
We་ct10 分钟前
LeetCode 48. 旋转图像:原地旋转最优解法
前端·算法·leetcode·typescript
黄筱筱筱筱筱筱筱20 分钟前
7.适合新手小白学习Python的异常处理(Exception)
java·前端·数据库·python
Yeats_Liao27 分钟前
微调决策树:何时使用Prompt Engineering,何时选择Fine-tuning?
前端·人工智能·深度学习·算法·决策树·机器学习·prompt
晚霞的不甘28 分钟前
Flutter for OpenHarmony 实现 iOS 风格科学计算器:从 UI 到表达式求值的完整解析
前端·flutter·ui·ios·前端框架·交互
陈希瑞31 分钟前
OpenClaw Chrome扩展使用教程 - 浏览器中继控制
前端·chrome