详解JS中的new

  在传统的面向对象语言中,“构造函数”是类中的一些特殊方法,使用new初始化时会调用类中的构造函数,通常形式为:

obj=new MyClass(...)

  而JavaScript中的new操作符,其实与面向类的语言完全不同。js中的构造函数只是一些使用new操作符是被调用的函数,它们并不属于某个类,也不会实例化一个对象,它们只是普通函数而已。所以包括内置对象函数(如Number(…))在内的所用函数都可以用new来调用。
  了解了这些,我们就可以来具体看看new到底做了什么。一般分为如下几个步骤:
1、创建一个空对象
2、这个对象会被执行[[Prototype]]连接
3、这个对象会绑定到函数调用的this上
4、如果函数没有返回其他对象,那么new表达式中的函数会自动返回这个新对象
  具体代码实现如下:

function newFun(P) {
    let obj={}
    let params=Array.prototype.slice.call(arguments,1)
    console.log(params)
    obj.__proto__=P.prototype      //或者 let obj=Object.create(P.prototype)
    P.prototype.constructor = P;   //将P的构造函数强制指向回来,这里其实可以不用
    P.apply(obj,params)    //this指向新对象
    return obj
}

这里详细解释this指向,P.apply(obj,params)相当于如下代码:

obj.fn = this; //这里的this就是调用P函数
obj.fn();   //相当于执行P函数,P函数里的this指向调用它的obj,所以obj可以拿到P中的属性
delete obj.fn;

最后验证一下:

let person1=newFun(Person,'paul',25,'doctor')
alert(person1instanceof Person); //true
alert(person1.__proto__.constructor === Person); //true

参考文档

  1. 《你不知道的JavaScript上卷》
### 基本特性 `new Map()` 是用来创建一个新的 `Map` 对象的构造函数。`Map` 对象保存键值对,并记住键的原始插入顺序,这意味着可以迭代 `Map` 对象,按键的插入顺序获取键值对。`Map` 是一种内置的数据结构,用于存储键值对,与普通对象不同,其键可以是任何类型的值,包括对象、函数和原始值,且保持插入顺序,可通过各种方法进行操作[^1][^2]。 ### 基本用法 创建一个空的 `Map` 对象: ```javascript const myMap = new Map(); ``` ### 赋值操作 可以使用 `set()` 方法向 `Map` 中添加键值对: ```javascript const object = new Map(); object.set('name', 'mary'); object.set('age', 15); object.set(1, 'hello'); console.log(object); ``` ### 与普通对象的区别 JavaScript 的对象本质上是键值对的集合,但传统上只能用字符串当作键,这给使用带来了很大的限制。而 `Map` 数据结构的“键”范围不限于字符串,各种类型的值(包括对象)都可以当作键[^4]。 ### 常用方法 - **获取值**:使用 `get(key)` 方法根据键获取对应的值。 ```javascript const map = new Map(); map.set('key', 'value'); console.log(map.get('key')); // 输出: value ``` - **检查键是否存在**:使用 `has(key)` 方法检查 `Map` 中是否存在指定的键。 ```javascript const map = new Map(); map.set('key', 'value'); console.log(map.has('key')); // 输出: true ``` - **删除键值对**:使用 `delete(key)` 方法删除指定键的键值对。 ```javascript const map = new Map(); map.set('key', 'value'); map.delete('key'); console.log(map.has('key')); // 输出: false ``` - **清空 `Map`**:使用 `clear()` 方法清空 `Map` 中的所有键值对。 ```javascript const map = new Map(); map.set('key', 'value'); map.clear(); console.log(map.size); // 输出: 0 ``` - **获取键的数量**:使用 `size` 属性获取 `Map` 中键值对的数量。 ```javascript const map = new Map(); map.set('key1', 'value1'); map.set('key2', 'value2'); console.log(map.size); // 输出: 2 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值