上文《详解Javascript的继承实现》介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构建,还能使代码在整体上保持一致的风格,便于其它同事阅读和理解。在写完该文之后,这两天时不时都在思考这个库可能存在的问题,加上这两天又在温习《JavaScript面向对象编程指南》这本书继承这一章的内容,发现对继承的内容有了一些新的发现和理解,有必要再把这两天的收获再分享出来。
1. 继承库的注意事项
为了方便阅读本部分的内容,只好先把上文继承库的实现代码和演示代码再搬出来,省的还得回到那篇文章去找相关内容,好在代码我加了折叠的功能,即使不想展开看,也不会太影响阅读:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
//继承库实现部分 var Class = (function () { var hasOwn = Object.prototype.hasOwnProperty; //用来判断是否为Object的实例 function isObject(o) { return typeof (o) === 'object'; } //用来判断是否为Function的实例 function isFunction(f) { return typeof (f) === 'function'; } //简单复制 function copy(source) { var target = {}; for (var i in source) { if (hasOwn.call(source, i)) { target[i] = source[i]; } } return target; } function ClassBuilder(options) { if (!isObject(options)) { throw new Error('Class options must be an valid object instance!'); } var instanceMembers = isObject(options) & options.instanceMembers || {}, staticMembers = isObject(options) && options.staticMembers || {}, extend = isObject(options) && isFunction(options.extend) && options.extend, prop; //表示要构建的类的构造函数 function TargetClass() { if (extend) { //如果有要继承的父类 //就在每个实例中添加baseProto属性,以便实例内部可以通过这个属性访问到父类的原型 //因为copy函数导致原型链断裂,无法通过原型链访问到父类的原型 this.ǣ,额外的好处是,如果所有类都用这种库来构建,还能使代码在整体上保持一致的风格,便于其它同事阅读和理解。在写完该文之后,这两天时不时都在思考这个库可能存在的问题,加上这两天又在温习《JavaScript面向对象编程指南》这本书继承这一章的内容,发现对继承的内容有了一些新的发现和理解,有必要再把这两天的收获再分享出来。
1. 继承库的注意事项为了方便阅读本部分的内容,只好先把上文继承库的实现代码和演示代码再搬出来,省的还得回到那篇文章去找相关内容,好在代码我加了折叠的功能,即使不想展开看,也不会太影响阅读:
|