Welcome 微信登录

首页 / 脚本样式 / JavaScript / JavaScript的实例化与继承:请停止使用new关键字

JavaScript的实例化与继承:请停止使用new关键字2014-09-12 infoq 李光毅JavaScript中的new关键字可以实现实例化和继承的工作,但个人认为使用new关键字并非是最佳的实践,还可以有更友好一些的实现。本文将介绍使用new关键字有什么问题,然后介绍如何对与new相关联的一系列面向对象操作进行封装,以便提供更快捷的、更易让人理解的实现方式。

传统的实例化与继承

假设我们有两个类,Class:function Class() {}和SubClass:function SubClass(){},SubClass需要继承自Class。传统方法一般是按如下步骤来组织和实现的:

Class中被继承的属性和方法必须放在Class的prototype属性中

SubClass中自己的方法和属性也必须放在自己prototype属性中

SubClass的prototype对象的prototype(__proto__)属性必须指向的Class的prototype

这样一来,由于prototype链的特性,SubClass的实例便能追溯到Class的方法,从而实现继承:

new SubClass()Object.create(Class.prototype)||VVSubClass.prototype ---> { }{ }.__proto__ ---> Class.prototype
举一个具体的例子:下面的代码中,我们做了以下几件事:

定义一个父类叫做Human

定义一个名为Man的子类继承自Human

子类继承父类的一切属性,并调用父类的构造函数,实例化这个子类

// 构造函数/基类function Human(name) {this.name = name;}/* 基类的方法保存在构造函数的prototype属性中便于子类的继承*/Human.prototype.say = function () {console.log("say");}/*道格拉斯的object方法(等同于object.create方法)*/function object(o) {var F = function () {};F.prototype = o;return new F();}// 子类构造函数function Man(name, age) {// 调用父类的构造函数Human.call(this, name);// 自己的属性agethis.age = age;}// 继承父类的方法Man.prototype = object(Human.prototype);Man.prototype.constructor = Man;// 实例化子类var man = new Man("Lee", 22);console.log(man);// 调用父类的say方法:man.say();
DEMO