现在我们来看看Ext.extend,应该完全没有问题了。我们用了两个方法extend,extend2,Ext把它合并为了一个方法Ext.extend,所以它会判断传进来的参数然后进行变换,这样Ext.extend就支持两个参数和三个参数进行调用。对于前面用到拷贝属性,Ext做了一个工具函数叫做Ext.apply,对于将一个对象的属性拷贝到一个类的原型上,Ext做了一个工具类叫做Ext.override。
- Ext.extend = function() {
-
- var io = function(o) {
- for (var m in o) {
- this[m] = o[m];
- }
- };
-
- var oc = Object.prototype.constructor;
-
- return function(sb, sp, overrides) {
-
- if (typeof sp == 'object') {
- overrides = sp;
- sp = sb;
- sb = overrides.constructor != oc ? overrides.constructor : function() {
- sp.apply(this, arguments);
- };
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- var F = function() {
- },
- sbp,
- spp = sp.prototype;
-
- F.prototype = spp;
- sbp = sb.prototype = new F();
-
-
- sbp.constructor = sb;
-
- sb.superclass = spp;
-
-
-
-
-
- if (spp.constructor == oc) {
- spp.constructor = sp;
- }
-
-
- sb.override = function(o) {
- Ext.override(sb, o);
- };
-
-
- sbp.superclass = sbp.supr = (function() {
- return spp;
- });
-
-
- sbp.override = io;
-
-
- Ext.override(sb, overrides);
-
-
- sb.extend = function(o) {
- return Ext.extend(sb, o);
- };
-
- return sb;
- };
- }();
|
现在使用Ext的extend来实现我们之前的继承代码就如下
- var Plane = function(o) {
- this.x = o.x;
- this.y = o.y;
- };
-
-
- Plane.prototype.XY = function() {
- alert(this.x * this.y);
- };
-
- var Space = Ext.extend(Plane, {
- constructor : function(o) {
- Space.superclass.constructor.call(this, o);
- this.z = o.z;
- },
- XYZ : function() {
- alert(this.x * this.y * this.z);
- }
- });
-
- var space = new Space({ x:2,y:3,z:4});
-
- space.XY();
- space.XYZ();
|