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) | | V V SubClass.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); // 自己的属性age this.age = age; } // 继承父类的方法 Man.prototype = object(Human.prototype); Man.prototype.constructor = Man; // 实例化子类 var man = new Man("Lee", 22); console.log(man); // 调用父类的say方法: man.say();
DEMO
查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/script/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索类的实例化
, class
, 方法
, function
, prototype
, 属性
, 子类
new关键字
,以便于您获取更多的相关知识。