javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > js new函数是执行函数吗

JavaScript new一个函数相当于执行这个函数吗

作者:岛泪

在JavaScript中new操作符用于创建一个用户自定义的对象类型的实例或具有构造函数的内置对象类型之一,这篇文章主要介绍了JavaScript new一个函数是不是相当于执行这个函数的相关资料,需要的朋友可以参考下

前言

在 JavaScript 中,使用 new 关键字调用函数(构造函数)与直接执行函数有本质区别,不是简单的函数执行。主要区别如下:

1.new操作符的完整执行过程

function MyClass(name) {
  this.name = name;
}

const obj = new MyClass("John"); // 不是简单执行函数!

实际发生的步骤:

  1. 创建新对象:创建一个空的纯 JavaScript 对象 {}

  2. 绑定原型:将新对象的原型指向构造函数的 prototype 属性
    obj.__proto__ = MyClass.prototype

  3. 绑定 this:将构造函数内的 this 指向这个新对象

  4. 执行函数体:像普通函数一样执行构造函数代码(此时 this 指向新对象)

  5. 返回对象

    • 如果构造函数未返回对象 → 自动返回新创建的对象

    • 如果返回非对象 → 仍返回新创建的对象

    • 如果返回对象 → 则替代新对象(实际返回该对象)

2. 与直接执行的对比

特性new MyClass()MyClass()
this 指向指向新创建的实例对象严格模式:undefined
非严格模式:全局对象(如 window
返回值自动返回新对象(除非构造函数返回对象)返回函数的显式返回值(无返回则为 undefined
原型链自动连接构造函数的原型无原型链建立
副作用安全创建实例可能污染全局变量(非严格模式)

3. 关键区别示例

function Person(name) {
  this.name = name;
}

// ✅ 正确用法:new 操作符
const p1 = new Person("Alice");
console.log(p1.name); // "Alice"(实例属性)

// ❌ 直接调用(非严格模式)
const p2 = Person("Bob");
console.log(p2);      // undefined(函数无返回值)
console.log(window.name); // "Bob"(污染全局!)

// ❌ 直接调用(严格模式)
"use strict";
const p3 = Person("Chris"); // 抛出错误:Cannot set property 'name' of undefined

4. 特殊情况的返回值

function A() { return { flag: true }; }
function B() { return 42; } // 返回原始值会被忽略

console.log(new A()); // { flag: true }(返回对象)
console.log(new B()); // {}(返回原始值无效,仍生成新对象)

总结:

💡 最佳实践:构造函数首字母大写(如 Person),提醒调用者必须使用 new。现代 JS 可用 class 语法避免混淆。

到此这篇关于JavaScript new一个函数相当于执行这个函数的文章就介绍到这了,更多相关js new函数是执行函数吗内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文