手写一个简单易懂的new

本文详细介绍了如何正常使用JavaScript的new操作符,并通过实例解析了如何手写一个myNew来模拟new的行为,包括创建空对象、设置原型、改变this指向及参数传递等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.正常使用new

function Xue(name){
    this.name = name
}
Xue.prototype.sayName = function(){
    console.log(this.name)
}
var xue = new Xue('我是Xue')
Xue.sayName() // 我是Xue
xue.sayName() // 我是Xue

2.自己手写一个mynew

function Xue(name){
    this.name = name
}
Xue.prototype.sayName = function(){
    console.log(this.name)
}
// 上面是本身Xue
// ...args为ES6展开符,也可以使用arguments

function mynew(fn,...args){   
    //先用Object创建一个空的对象
    //fn.prototype代表 用当前对象的原型去创建
    // 或者可以用obj.__proto__ = Fu.prototype继承原型
    const obj = Object.create(fn.prototype)  
    
    //现在obj就代表Xue了,但是参数和this指向没有修改
    const rel = fn.apply(obj,args)
    
    //正常规定,如何fn返回的是null或undefined(也就是不返回内容),我们返回的是obj,否则返回rel
    return rel instanceof Object ? rel : obj
}
var xue = mynew(Xue,'这是用mynew出来Xue')
Xue。sayName() // 这是用mynew出来Xue
xue.sayName() // 这是用mynew出来Xue

3.总结new的具体步骤

1.创建一个空对象 var obj = {}
2.修改obj.proto=Fn.prototype
3.只改this指向并且把参数传递过去,call和apply都可以
4.根据规范,返回 null 和 undefined 不处理,依然返回obj

### 构建简单自定义工作流引擎的实现思路 构建一个简单的自定义工作流引擎涉及多个方面,包括设计模式的选择、数据存储的设计以及具体的编程实践。以下是详细的实现思路: #### 设计模式选择 为了使工作流引擎具有良好的可维护性和扩展性,推荐采用面向对象设计原则中的责任链模式和状态模式。这两种模式可以帮助清晰地分离不同阶段的任务逻辑。 - **责任链模式**:用于管理一系列处理器节点之间的传递关系,使得请求可以在这些节点间依次流动直到被处理完成。 - **状态模式**:允许对象在其内部状态改变时调整其行为。对于复杂的工作流程来说,这有助于简化业务逻辑并提高系统的灵活性[^1]。 #### 数据库表结构规划 合理规划数据库表结构至关重要。通常至少需要三个核心表格来支撑基本功能: - `workflows` 表保存整个工作流的信息; - `tasks` 表记录每个独立任务的数据及其属性; - `transitions` 或者称为路径表用来描述任务间的转换条件与顺序。 ```sql CREATE TABLE workflows ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), description TEXT ); CREATE TABLE tasks ( id INT PRIMARY KEY AUTO_INCREMENT, workflow_id INT NOT NULL, title VARCHAR(255), status ENUM('pending', 'in_progress', 'completed') DEFAULT 'pending', FOREIGN KEY (workflow_id) REFERENCES workflows(id) ); ``` #### 编程接口设计 通过Python语言作为例子展示如何创建基础类来进行交互操作。这里会涉及到几个主要组件——WorkflowManager, TaskHandler 和 TransitionEvaluator. ```python class WorkflowManager: def __init__(self): self.workflows = {} def add_workflow(self, wf_name, task_list=None): new_wf = {"name": wf_name} if isinstance(task_list, list): new_wf["tasks"] = {t.id: t for t in task_list} self.workflows[wf_name] = new_wf class TaskHandler: def execute_task(self, task_id): pass # Implement specific logic here def update_status(self, task_id, new_state): pass # Update the state of a given task class TransitionEvaluator: @staticmethod def evaluate_transition(current_task, next_tasks_conditions): """Evaluate whether we can move to any one of the provided next tasks.""" pass # Logic implementation required ``` #### 测试驱动开发(TDD) 遵循测试先行的原则,在编任何生产代码之前先出单元测试案例。这样可以确保每一步都按照预期执行,并且能够快速定位错误源。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值