深入理解JavaScript 'new' 关键字与手写实现
需积分: 9 37 浏览量
更新于2024-10-23
收藏 907B ZIP 举报
资源摘要信息:"js代码-new的本质 手写代码"
在JavaScript中,`new` 关键字用于创建一个实例对象。理解`new`的原理对于深入理解JavaScript的原型链和对象构造机制至关重要。通常,使用`new`时会调用一个构造函数,这个构造函数会初始化新创建的对象。
构造函数通常是首字母大写的函数,这是为了与普通函数做区分。当`new`操作符被用于一个函数时,会执行以下步骤:
1. 创建一个新的空对象。
2. 将新对象的原型(`__proto__`)设置为构造函数的原型属性(`prototype`)。
3. 将构造函数的作用域链设置为当前新创建的对象,也就是将`this`绑定到新对象上。
4. 执行构造函数中的代码,通常会使用`this`为新对象添加属性。
5. 如果构造函数没有返回非空对象,则返回新创建的对象。
了解了`new`的本质之后,我们可以尝试手写一个模拟`new`操作符的函数。以下是手写`new`函数的示例代码:
```javascript
function myNew(constructor, ...args) {
// 创建一个空对象
const obj = {};
// 将对象的原型设置为构造函数的原型
Object.setPrototypeOf(obj, constructor.prototype);
// 绑定this并执行构造函数
const result = constructor.apply(obj, args);
// 如果构造函数有返回值且为对象,则返回该对象,否则返回新创建的对象
return typeof result === 'object' && result !== null ? result : obj;
}
```
使用这个`myNew`函数可以达到和`new`操作符类似的效果。例如:
```javascript
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name);
};
const person = myNew(Person, 'Alice', 28);
person.sayHello(); // 输出: Hello, my name is Alice
```
在这个过程中,我们首先创建了一个空对象`obj`,然后使用`Object.setPrototypeOf`方法将其原型设置为构造函数`Person`的`prototype`属性指向的原型对象。通过`constructor.apply`方法调用构造函数,`this`被正确地绑定到了新创建的对象上。最后,我们检查构造函数返回的值,如果是一个对象(不为`null`),则返回这个对象,否则返回新创建的对象。
在了解`new`操作符的本质和手写`new`函数的过程中,我们还能够学到以下几个关键知识点:
- JavaScript中的原型链(prototype chain):JavaScript中每个对象都有一个指向其原型对象的内部链接,当访问一个对象的属性时,如果在该对象上找不到这个属性,就会去它的原型对象上找,直到找到该属性或者到达原型链的末端。
- `__proto__`与`prototype`的关系:每个JavaScript对象都持有一个`__proto__`属性,该属性指向它的原型对象。而`prototype`属性则是函数特有的属性,当函数作为构造函数使用时,通过`new`创建的新对象的原型会设置为该函数的`prototype`属性。
- `apply`方法:`apply`方法调用一个具有给定`this`值的函数,以及以数组形式提供的参数。这里的`apply`方法用于执行构造函数,并将新对象绑定到`this`上。
- 函数作用域和`this`上下文:在JavaScript中,函数的`this`关键字是动态绑定的,取决于函数的调用方式。在构造函数中使用`new`关键字,`this`会指向新创建的对象。
通过手写`new`函数,我们能够更深刻地理解JavaScript对象的创建过程和原型链的工作原理,这对于编写更高质量的JavaScript代码是非常有帮助的。同时,理解构造函数、原型链、作用域和`this`上下文的关系,将有助于我们更好地利用JavaScript的面向对象编程特性。
856 浏览量
128 浏览量
823 浏览量
2021-07-16 上传
2021-07-15 上传
133 浏览量
2024-03-31 上传
128 浏览量
114 浏览量
weixin_38530202
- 粉丝: 2
- 资源: 876
最新资源
- 可爱蝴蝶图标下载
- containment-unit:使用 Docker 支持 Postgres 测试
- CartPoleDesign
- doophp(php框架) v1.4.1
- CompSoc-Highlight:BICs 2020大奖的重点网站
- 小丑鱼图标下载
- 虚拟演示
- 初级java笔试题-learn-to-code:学习编码
- ModelMaker Code Explorer 15.0.13.2378 (Delphi 代码增强工具)
- 章鱼卡通图标下载
- putty-64位安装包.zip
- 智能家居行业小程序源码.zip
- CSC-2110-Project
- 22_Bit_CPU_MIPS
- XCSandboxViewer:App sandbox file manager of iOS device ! iOS真机沙盒文件管理器 !
- Công Cụ Đặt Hàng Của Đặt Hàng Siêu Tốc 247-crx插件