likes
comments
collection
share

JS小知识:深入理解`new`操作符及单例模式

作者站长头像
站长
· 阅读数 59

在Javascript中,大家可能会经常用到new一个实例对象,但是你真的知道new在做什么事情吗?他的幕后操作又是怎样的呢?本文将深入探讨new操作符的工作原理,手写实现new的过程,并介绍单例模式这一设计模式,力求以通俗易懂的方式解析这些核心概念。

JS小知识:深入理解`new`操作符及单例模式

new操作符

当你在JavaScript中使用new关键字调用一个函数时,实际上发生了一系列幕后操作:

function Duck(nickname){
    this.nickname=nickname;
}
const yw =new Duck('鸭王')
  1. 创建空对象:首先,JavaScript引擎会创建一个新的空对象(即{})。
  2. 绑定this:接着,这个新创建的对象被绑定为当前执行环境的this上下文,这意味着在这个函数体内,你可以通过this关键字访问和修改这个新对象。
  3. 执行构造函数:构造函数(如Duck)会被执行,用于初始化新对象的属性和方法。例如,this.nickname = nickname;会给新对象添加一个属性。
  4. 原型链设定:新对象的__proto__属性会被设置为构造函数的prototype对象,从而实现了原型链继承。这意味着如果在实例对象上找不到某个属性或方法,JavaScript引擎会沿着原型链向上查找。
  5. 返回对象:最后,如果构造函数没有显式返回一个对象,new操作符会默认返回这个初始化完成的新对象。

手写new

理解了new的工作流程后,我们可以尝试手动模拟这个过程,如下所示:

function myNew(Fun, ...args) {
    const obj = {}; // 创建一个空对象
    Fun.apply(obj, args); // 将obj作为this,执行构造函数并传入参数
    obj.__proto__ = Fun.prototype; // 设置原型链
    return obj; // 返回新对象
}

这段代码复现了new操作的关键步骤,展示了如何无中生有地创建并初始化一个对象实例。

单例模式

单例模式是一种常用的软件设计模式,确保一个类只有一个实例,并提供一个全局访问点。

以下是一个简单的单例模式实现:

var Singleton = function(name) {
    this.name = name;
};

Singleton.prototype.getName = function() {
    console.log(this.name);
};

Singleton.getInstance = function(name) {
    if (!Singleton.instance) {
        Singleton.instance = new Singleton(name);
    }
    return Singleton.instance;
};

这里,getInstance方法充当了全局访问点,确保无论调用多少次,都只创建并返回同一个Singleton实例。这种方式可以减少不必要的对象创建,提高程序性能。

总结

要知道手写new操作符的过程可是会出现在面试题中的,因为这是一个底层的小知识,不过只要你理解了new操作符的幕后操作,这些都是小case。然后我们对单例模式的实现与应用场景有了一定的了解,能有效地提升程序的性能, 这些知识点不仅是面试中的常客,更是实际开发中构建复杂应用的基石。

JS小知识:深入理解`new`操作符及单例模式

转载自:https://juejin.cn/post/7379221811239665691
评论
请登录