Crockford式JavaScript继承详解与示例

0 下载量 16 浏览量 更新于2024-08-30 收藏 68KB PDF 举报
"这篇文章主要讲解了JavaScript中的Crockford式继承,这是一种经典的继承实现方式,由JavaScript领域的权威人物Douglas Crockford提出。Crockford是JSON、JSLint、JSMin和ADSafe等工具的创始人,同时也是《JavaScript: The Good Parts》一书的作者,对JavaScript社区有着深远的影响。在文中,作者展示了如何使用`method`、`inherits`和`uber`这些自定义函数来实现类的继承和方法的调用。" 在JavaScript中,由于其语言特性,没有内置的类和继承机制,但可以通过模拟实现。Crockford式继承就是一种常见的模拟方式。以下是对这个模式的详细解释: 1. 定义类(对象构造器): - `function Person(name)` 定义了一个名为Person的构造函数,用于创建表示人的对象,接收一个参数name。 - `Person.method("getName", function() { return this.name; })` 为Person类添加了一个原型方法`getName`,它返回对象的name属性。 2. 继承机制: - `function Employee(name, employeeID)` 定义了另一个构造函数Employee,用于创建表示员工的对象,接收两个参数name和employeeID。 - `Employee.inherits(Person)` 这一行代码表示Employee类将继承Person类,但这里具体的`inherits`函数实现并未给出,通常会通过修改`prototype`来实现继承。 - 子类继承父类后,可以覆盖或扩展父类的方法。例如,Employee也定义了一个`getName`方法,但在调用时,它会先调用父类的`getName`方法,再添加额外的信息。 3. 子类方法: - `Employee.method("getEmployeeID", function() { return this.employeeID; })` 添加了一个新的方法`getEmployeeID`,返回员工的ID。 - 子类的`getName`方法使用`uber`函数来调用父类的`getName`,这表明`uber`是一个用于访问父类方法的辅助函数,但具体实现也没有给出。 4. 实例化和调用: - `var zhang = new Employee("ZhangSan", "1234")` 创建了一个Employee类的新实例,名为zhang。 - `console.log(zhang.getName())` 打印出"Employeename:ZhangSan",显示了子类方法如何正确地调用了父类方法并进行了扩展。 然而,这种继承方式存在一些问题: - 顺序依赖:子类继承父类的代码必须在子类和父类都定义好之后进行,并且必须在子类定义任何方法之前,这限制了代码的灵活性。 - 父类构造函数调用:子类的构造函数不能直接调用父类的构造函数,这意味着初始化数据时需要手动处理。 - 代码优雅性:这种实现方式的代码结构不够直观和简洁,可能造成阅读和维护的困难。 为了克服这些问题,后来的ES6引入了`class`语法,使得类和继承变得更加自然和易于理解。不过,在不支持ES6的环境中,Crockford式继承仍是一种常用的实现方式。