JS小知识:深入理解`new`操作符及单例模式
在Javascript中,大家可能会经常用到new
一个实例对象,但是你真的知道new
在做什么事情吗?他的幕后操作又是怎样的呢?本文将深入探讨new
操作符的工作原理,手写实现new
的过程,并介绍单例模式这一设计模式,力求以通俗易懂的方式解析这些核心概念。
new
操作符
当你在JavaScript中使用new
关键字调用一个函数时,实际上发生了一系列幕后操作:
function Duck(nickname){
this.nickname=nickname;
}
const yw =new Duck('鸭王')
- 创建空对象:首先,JavaScript引擎会创建一个新的空对象(即
{}
)。 - 绑定
this
:接着,这个新创建的对象被绑定为当前执行环境的this
上下文,这意味着在这个函数体内,你可以通过this
关键字访问和修改这个新对象。 - 执行构造函数:构造函数(如
Duck
)会被执行,用于初始化新对象的属性和方法。例如,this.nickname = nickname;
会给新对象添加一个属性。 - 原型链设定:新对象的
__proto__
属性会被设置为构造函数的prototype
对象,从而实现了原型链继承。这意味着如果在实例对象上找不到某个属性或方法,JavaScript引擎会沿着原型链向上查找。 - 返回对象:最后,如果构造函数没有显式返回一个对象,
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。然后我们对单例模式的实现与应用场景有了一定的了解,能有效地提升程序的性能,
这些知识点不仅是面试中的常客,更是实际开发中构建复杂应用的基石。
转载自:https://juejin.cn/post/7379221811239665691