JS手写一个new函数
时间: 2024-03-19 17:43:55 浏览: 115
当使用JavaScript中的`new`操作符时,实际上会发生以下四个步骤:
1. 创建一个新对象。
2. 将构造函数的作用域赋给这个新对象(因此`this`指向这个新对象)。
3. 执行构造函数中的代码(为这个新对象添加属性)。
4. 返回新对象。
因此,手写一个`new`函数的思路是模拟这四个步骤,这里给出一个实现示例:
```js
function myNew(constructor, ...args) {
// 创建一个新对象,并将构造函数的原型赋给这个新对象的原型
const obj = Object.create(constructor.prototype);
// 将构造函数的作用域赋给新对象,并执行构造函数
const result = constructor.apply(obj, args);
// 如果构造函数有返回值且返回值是一个对象,则返回该对象,否则返回新对象
return typeof result === 'object' && result !== null ? result : obj;
}
```
这个函数接受一个构造函数和一些参数,并返回一个新对象。它首先创建一个新对象,并把构造函数的原型赋给这个新对象的原型,然后将构造函数的作用域赋给新对象,并执行构造函数。最后,如果构造函数有返回值且返回值是一个对象,则返回该对象,否则返回新对象。
相关问题
js手写一个深拷贝函数
当然可以!以下是一个用 JavaScript 手写的深拷贝函数:
```javascript
function deepClone(obj) {
// 检查是否为数组或对象
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let clone = Array.isArray(obj) ? [] : {};
// 遍历对象的所有属性/元素并进行深拷贝
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
```
你可以使用这个函数来深拷贝一个对象或者数组,例如:
```javascript
let originalObj = {
name: "John",
age: 30,
hobbies: ["reading", "coding"],
address: {
street: "123 Main St",
city: "New York"
}
};
let clonedObj = deepClone(originalObj);
console.log(clonedObj);
```
这样,`clonedObj` 将是 `originalObj` 的一个完全独立的副本,对其进行修改不会影响原始对象。
手写一个实现串行的promise函数
当可以,以下是一个简单的串行执行 Promise 的函数实现:
```javascript
function serialPromise(promises) {
let result = Promise.resolve();
promises.forEach(promise => {
result = result.then(() => promise());
});
return result;
}
```
使用示例:
```javascript
// 定义三个异步函数
function asyncFunc1() {
return new Promise(resolve => {
setTimeout(() => {
console.log('Async function 1');
resolve();
}, 1000);
});
}
function asyncFunc2() {
return new Promise(resolve => {
setTimeout(() => {
console.log('Async function 2');
resolve();
}, 2000);
});
}
function asyncFunc3() {
return new Promise(resolve => {
setTimeout(() => {
console.log('Async function 3');
resolve();
}, 1500);
});
}
// 定义一个包含异步函数的数组
const asyncFuncs = [asyncFunc1, asyncFunc2, asyncFunc3];
// 串行执行异步函数
serialPromise(asyncFuncs)
.then(() => {
console.log('All promises completed');
})
.catch(error => {
console.error('Error:', error);
});
```
上述代码中,`serialPromise` 函数接收一个包含异步函数的数组 `promises`。它通过初始化一个 resolved 状态的 Promise 对象 `result`,然后依次使用 `then` 方法将每个异步函数串行执行。最后返回最终的 Promise 对象 `result`。在示例中,我们定义了三个异步函数,并将它们存储在 `asyncFuncs` 数组中。通过调用 `serialPromise(asyncFuncs)`,我们实现了按照顺序依次执行这三个异步函数,输出结果为:
```
Async function 1
Async function 2
Async function 3
All promises completed
```
请注意,上述代码只是一个基本的串行 Promise 实现示例,实际应用中可能需要更多的错误处理和优化。
阅读全文