EXTJS框架面向对象与继承机制深入解析

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:面向对象编程是JavaScript中的一种设计模式,EXTJS框架提供了强大的UI组件和数据绑定功能,其中面向对象和继承的概念尤为重要。本篇文章深入探讨了EXTJS中的类定义、继承实现、事件系统以及多态等面向对象基础和高级特性,揭示了EXTJS如何通过面向对象和继承机制来实现代码复用和模块化,以及这些机制在实际开发中的应用。 ext面向对象和继承

1. 面向对象编程在JavaScript中的应用

面向对象编程(OOP)是一种编程范式,它利用“对象”的概念来设计软件程序。在JavaScript中,虽然其底层是基于原型链的,但其对象模型足够灵活,以至于我们可以将其视为采用类似于传统面向对象语言(如Java或C++)的特性。这一章节将介绍JavaScript中OOP的关键概念及其应用。

1.1 JavaScript中的对象与类

在JavaScript中,对象是基于键值对的集合,其中键是字符串(或ES6之后可以是Symbol),值可以是任何数据类型,包括其他对象。虽然JavaScript没有传统的类概念,但ES6引入了 class 关键字,为基于原型的继承提供了一种更清晰和直观的语法糖。

// 使用class关键字定义类
class Person {
  constructor(name) {
    this.name = name;
  }

  greet() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

// 实例化一个Person对象
let person = new Person('Alice');
person.greet(); // 输出: Hello, my name is Alice

在上述代码中,我们定义了一个 Person 类,并创建了这个类的实例。

1.2 继承和多态在JavaScript中的实现

继承是面向对象编程的核心之一,它允许一个对象获得另一个对象的属性和方法。在JavaScript中,继承可以通过原型链或者使用ES6的 class extends 关键字实现。

// 使用extends关键字实现继承
class Student extends Person {
  constructor(name, grade) {
    super(name); // 调用父类构造函数
    this.grade = grade;
  }

  showGrade() {
    console.log(`${this.name} is in grade ${this.grade}`);
  }
}

let student = new Student('Bob', 5);
student.greet(); // 输出: Hello, my name is Bob
student.showGrade(); // 输出: Bob is in grade 5

多态是指不同对象以不同的方式响应同一消息的能力。在JavaScript中,我们可以利用函数重载和继承来实现多态。

// 函数重载实现多态
function speak(student) {
  if (student instanceof Person) {
    console.log('I can speak');
  } else if (student instanceof Student) {
    console.log('I can speak and show my grade');
  }
}

speak(person); // 输出: I can speak
speak(student); // 输出: I can speak and show my grade

面向对象编程的这些特性,如继承和多态,在JavaScript中提供了强大灵活的方式来进行代码组织和复用,这对于构建可扩展和可维护的应用程序至关重要。接下来的章节中,我们将深入探讨EXTJS框架,一个专门为了JavaScript开发的面向对象的框架,并分析其组件模型、类系统以及面向对象和继承机制对开发效率和代码维护的提升。

2. EXTJS框架概述及其组件模型特点

2.1 EXTJS框架简介

EXTJS是一款由Sencha公司开发的JavaScript框架,它提供了一整套丰富的组件库,用于开发富互联网应用(RIA)。由于其功能全面,性能高效,自发布以来,EXTJS就被许多开发者用于构建复杂的前端界面和交互功能。

2.1.1 EXTJS的历史和定位

EXTJS自2007年首次发布以来,已经发展了多个版本,它的设计目标是提高JavaScript开发的生产力,并提供一致的跨浏览器体验。在众多的JavaScript框架中,EXTJS定位在企业级市场,重点是打造功能强大、高度可定制的用户界面。

EXTJS框架的组件式架构,为开发者提供了一个类似于桌面应用程序的开发模式。开发者可以利用EXTJS提供的大量预制组件来快速搭建复杂的用户界面,而不需要从零开始编写大量的代码。这大大缩短了开发周期,并提高了产品的交付速度。

在定位上,EXTJS特别适合于需要快速构建复杂、高度定制化界面的场景,比如企业管理系统、仪表板、复杂的表格和数据可视化等。通过其丰富的组件和强大的主题定制能力,开发者能够创造出美观且一致的用户体验。

2.1.2 EXTJS的架构设计原则

EXTJS框架的设计遵循了一些核心原则,其中包括模块化、可复用性以及良好的性能优化。它采用模块化的架构,允许开发者仅引入所需的部分,减少了最终打包文件的大小。

EXTJS的设计原则还强调了可复用性。通过组件继承和插件机制,开发者可以创建可复用的组件,这些组件可以在不同的项目中重用,从而加速开发流程,并保持一致的用户体验。

性能优化在EXTJS中也占据重要位置。框架通过优化DOM操作、使用虚拟滚动、减少渲染次数等技术手段,提高了应用程序的运行效率。此外,EXTJS还支持多种主题,允许开发者通过主题切换来适配不同的设计需求,而无需重写任何组件的样式。

2.2 组件模型的核心特点

EXTJS的组件模型是其核心特性之一,组件模型的设计使得EXTJS能够在不同的应用场景下提供灵活而强大的用户界面元素。

2.2.1 组件的生命周期管理

在EXTJS中,每个组件都有一个生命周期,这包括初始化、渲染、启用、停用和销毁等阶段。开发者可以在组件生命周期的各个阶段插入自定义逻辑,以便在组件的特定状态下执行特定操作。

组件生命周期的管理是通过一系列生命周期事件来实现的。例如,在组件被渲染之前,会触发 beforerender 事件,允许开发者在渲染之前修改组件的配置;在组件渲染之后,会触发 render 事件,开发者可以在此时执行需要在DOM元素渲染后进行的操作。

生命周期事件的管理提供了细粒度的控制,使得开发者能够精确地管理组件在不同阶段的行为。这使得EXTJS在处理复杂的用户界面交互时,能够提供高度的灵活性和控制力。

2.2.2 组件的复用和扩展机制

EXTJS组件模型的设计支持高效的复用和扩展。通过组件继承,开发者可以创建自定义组件,这些自定义组件能够继承并扩展现有组件的功能。

复用性在EXTJS中是通过所谓的“插件”概念来实现的。组件可以通过添加插件来获得额外的功能,而无需重新编写组件的核心代码。这不仅减少了代码的重复,而且使得组件更加轻量级和灵活。

扩展机制允许开发者在现有组件的基础上创建新组件,添加新的属性、方法和事件。这种能力对于满足不断变化的业务需求至关重要,因为它可以快速适应新功能的引入,而不需要对现有系统进行大规模的重构。

EXTJS的组件扩展性和复用性是通过一些核心类和方法来支持的,比如 Ext.extend() 用于扩展类, Ext.create() 用于创建类的实例。通过这些API,开发者可以轻松地在现有的组件基础上进行扩展和定制,以符合特定的业务需求。

代码示例:创建自定义组件

Ext.define('MyApp.view.CustomComponent', {
    extend: 'Ext.panel.Panel', // 继承自ExtJS的Panel组件
    alias: 'widget.customcomponent', // 为组件设置一个别名
    title: 'Custom Panel', // 设置面板标题
    html: 'Hello, this is a custom component.', // 设置面板内容
    initComponent: function() {
        this.callParent(arguments); // 调用父类的initComponent方法
    }
});

// 使用自定义组件
var customPanel = Ext.create('MyApp.view.CustomComponent', {
    renderTo: Ext.getBody(), // 将组件渲染到body元素中
    width: 300, // 设置宽度
    height: 200 // 设置高度
});

以上代码定义了一个名为 CustomComponent 的新组件,它继承自 Ext.panel.Panel 。通过 alias 属性定义了一个别名 customcomponent ,之后可以通过这个别名在其他地方引用这个组件。通过调用 Ext.create() 方法,我们实例化了这个自定义组件,并将其渲染到了页面的body元素中。

在此过程中,我们复用了 Ext.panel.Panel 的功能,并通过扩展创建了新的组件,这展示了EXTJS组件模型的强大复用和扩展能力。通过这种方式,开发者可以将代码组织得更加模块化,增强代码的可维护性和可读性。

3. Ext.extend() 方法在类继承中的作用

3.1 Ext.extend() 方法的原理

3.1.1 原型链继承的原理和实现

JavaScript中的继承机制通常利用原型链来实现。原型链是一种将对象连接在一起,形成一条从原始对象到继承对象的链条。在这样的链条中,如果一个属性或方法在当前对象上未找到,解释器会继续沿着原型链向上搜索,直到找到匹配的属性或方法为止。

在使用 Ext.extend() 方法之前,先理解JavaScript的原生继承机制会有所帮助。原生JavaScript继承可以使用构造函数加 prototype 的方式来实现。例如:

function Parent(name) {
    this.name = name;
}

Parent.prototype.getName = function() {
    return this.name;
};

function Child(name, age) {
    Parent.call(this, name);
    this.age = age;
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

var child = new Child('小明', 5);
console.log(child.getName()); // 输出: 小明

上述例子展示了如何使用 Object.create() 创建一个新对象,并将 Parent.prototype 作为新对象的原型。然后重写 Child.prototype.constructor 以指向 Child 构造函数,以保持原型链的完整性。

3.1.2 Ext.extend() 与原生JavaScript继承的比较

Ext.extend() 是EXTJS框架提供的一个工具函数,用于在框架的类系统内部创建子类。它封装了上述原生JavaScript继承的复杂性,并提供了一个更为清晰和简洁的接口。

通过 Ext.extend() ,继承变得非常简单。下面是一个 Ext.extend() 的例子:

Ext.define('Parent', {
    constructor: function(name) {
        this.name = name;
    },
    getName: function() {
        return this.name;
    }
});

Ext.define('Child', {
    extend: 'Parent', // 使用extend关键字指定父类
    constructor: function(name, age) {
        this.age = age;
        this.callParent(['小明']); // 调用父类构造函数
    }
});

var child = new Child('小明', 5);
console.log(child.getName()); // 输出: 小明

在上述代码中, Ext.extend() 方法不仅创建了子类 Child ,还自动设置了正确的原型链。 Child 类的实例能够访问到 Parent 类定义的 getName 方法。 callParent() 方法是一个特殊的EXTJS方法,用于调用父类的构造函数。

3.2 扩展类的构建和实例化

3.2.1 创建子类的方法和步骤

构建子类通常包括定义子类的属性、方法以及构造函数。在EXTJS中,这可以通过定义一个配置对象来实现,然后通过 Ext.define() 方法创建类。

创建子类的步骤如下:

  1. 使用 Ext.define() 方法定义父类。
  2. 在父类的配置对象中,定义其属性、方法和构造函数。
  3. 使用 Ext.define() 方法定义子类,设置 extend 属性指向父类。
  4. 在子类中覆盖或添加新的方法和属性。
  5. 调用子类构造函数创建实例。
3.2.2 子类实例化的过程和特点

实例化子类时, Ext.extend() 不仅处理原型链,还处理构造函数的调用,确保子类实例能够继承父类的所有属性和方法。

以下是子类实例化的过程和特点:

  1. 当创建子类实例时,会首先调用父类的构造函数,并传递任何传递给子类构造函数的参数。
  2. 父类构造函数执行后,子类构造函数中的代码将被执行。
  3. 如果子类构造函数中使用了 callParent ,则父类构造函数中相对应的方法将被调用。
  4. 如果子类没有自己的构造函数,则父类构造函数将负责初始化子类实例。

实例化过程中,如果子类重写了父类的方法,那么子类实例调用这些方法时将使用子类版本的方法,这就是多态的体现。

总结

在本章节中,我们深入了解了 Ext.extend() 方法的原理及其如何在JavaScript类继承中发挥作用。我们先回顾了原型链继承的原理,并通过原生JavaScript的构造函数继承进行了对比。随后,我们探索了 Ext.extend() 的使用方法,其如何简化继承的复杂性,并通过示例加深理解。最后,我们分析了通过 Ext.extend() 创建的子类的构建和实例化过程,及其与父类间的关联。这些内容为深入理解EXTJS类系统和JavaScript的继承提供了坚实的基础。

4. EXTJS类系统的特性

4.1 类定义的关键组成部分

4.1.1 配置项的定义和作用

在EXTJS中,类定义允许开发者指定一系列配置项(Configs),这些配置项是类实例化时可以接受的属性。它们不仅定义了对象的状态,还可以通过getter和setter方法来控制对这些属性的访问和修改。配置项的设计,旨在提供一种方式来定义对象属性,并且能够容易地进行修改或扩展,同时保持对类内部实现的封装。

配置项通过 cfg 关键字在类定义中进行声明,例如:

Ext.define('MyApp.model.MyModel', {
    extend: 'Ext.data.Model',
    fields: [
        {name: 'id', type: 'int'},
        {name: 'name', type: 'string'}
    ],
    config: {
        title: 'Default Title',
        description: 'This is a default description.'
    },
    //...
});

在这个例子中,我们定义了两个配置项 title description 。这些配置项通常与 getter setter 方法相关联,可以通过 Ext.create() 或类实例的 initialize 方法进行初始化,如:

var myModel = Ext.create('MyApp.model.MyModel', {
    title: 'My Custom Title',
    description: 'Custom description has been set.'
});

在上面的代码中, title description 作为 MyModel 实例的配置项被初始化,如果在类定义中没有为这些配置项提供 getter setter 方法,EXTJS将会自动生成它们。此外,使用配置项可以使得组件的配置更加灵活,因为它们可以在实例化时指定,也可以在组件创建后通过 set 方法动态设置。

4.1.2 构造函数的编写和调用

在EXTJS的类系统中,构造函数通常使用 constructor 关键字在类定义中进行声明。构造函数的主要作用是在创建类实例时进行初始化操作,包括设置实例的初始状态、绑定事件处理器或设置默认的配置项等。

在EXTJS中编写构造函数的例子如下:

Ext.define('MyApp.view.MyComponent', {
    extend: '***ponent',
    constructor: function(config) {
        this.initConfig(config);
        this.callParent(arguments);
    },
    //...
});

构造函数通常在子类中调用 callParent 方法,该方法的作用是调用父类的构造函数,以确保父类的初始化逻辑能够被执行。 this.initConfig(config); 的调用是EXTJS特有的初始化配置项的方式,确保传入的配置项能够被正确设置。

调用构造函数的过程通常发生在类实例化时,例如:

var myComponent = Ext.create('MyApp.view.MyComponent', {
    html: 'Hello, EXTJS!'
});

在上述代码中, html 属性作为配置项被传递给 MyComponent 的构造函数,实例化过程会调用构造函数,并通过 initConfig 方法设置配置项。构造函数的编写和调用是类初始化过程中的重要组成部分,它们确保了对象在被创建时具有正确的初始状态。

4.2 类的高级特性

4.2.1 静态属性和方法的定义及应用

静态属性和方法是EXTJS类系统中的高级特性之一。它们是属于类本身的属性和方法,而不是属于类的某个特定实例的。这意味着静态属性和方法可以被类的所有实例共享,不需要创建类的实例即可调用。

静态属性和方法可以通过在类定义中直接声明来实现。例如:

Ext.define('MyApp.model.MyModel', {
    extend: 'Ext.data.Model',
    statics: {
        // 静态属性
        defaultTitle: 'Default Title',
        // 静态方法
        setTitle: function(title) {
            this.defaultTitle = title;
        },
        getTitle: function() {
            return this.defaultTitle;
        }
    },
    //...
});

在上述示例中,我们定义了两个静态方法 setTitle getTitle 以及一个静态属性 defaultTitle 。静态方法可以直接通过类名来调用,无需实例化。

静态方法的使用示例:

var title = MyApp.model.MyModel.getTitle(); // "Default Title"
MyApp.model.MyModel.setTitle('New Title');
title = MyApp.model.MyModel.getTitle(); // "New Title"

静态属性和方法对于提供工具函数、常量或全局可用的配置等场景非常有用。它们可以简化代码,提高运行效率,避免了创建不必要的实例。

4.2.2 事件系统的实现和管理

EXTJS的事件系统是其类系统中的另一个高级特性,它允许开发者通过声明式的方式或编码的方式来进行事件的绑定、触发和管理。事件系统使得组件、类和对象能够响应用户的操作或程序内部的状态变化。

在EXTJS中声明事件,通常是在类定义中使用 events 属性。例如:

Ext.define('MyApp.view.MyComponent', {
    extend: '***ponent',
    events: [
        'click',
        'doubleclick'
    ],
    //...
});

在这个例子中, MyComponent 声明了两个事件: click doubleclick 。这些事件可以通过事件处理器(通常称为监听器)进行处理。监听器可以在类定义中通过 listeners 配置项进行配置,或者在实例创建后动态添加。

监听器的配置示例:

var myComponent = Ext.create('MyApp.view.MyComponent', {
    listeners: {
        click: function() {
            alert('Component was clicked.');
        },
        doubleclick: function() {
            alert('Component was double clicked.');
        }
    }
});

在上面的代码中,为 click doubleclick 事件添加了监听器函数。这些函数会在相应的事件被触发时执行。

事件管理器会追踪注册到事件上的监听器,并在适当的时机调用它们。事件系统不仅限于用户交互,它还能够用于对象状态变化的监听,比如数据模型的变更等。

事件系统是EXTJS中一个非常强大的特性,它提供了一种高效的方式来处理事件驱动编程,促进了程序之间的解耦,提高了代码的可维护性和扩展性。

5. ```

第五章:EXTJS组件的继承实现方法

5.1 组件继承的基本原理

5.1.1 组件继承与类继承的联系

在EXTJS中,组件的继承是通过类的继承实现的,这与传统的面向对象编程语言中的继承概念类似。在EXTJS中,所有的组件都是 ***ponent 的子类。这意味着,当你创建一个新组件时,你实际上是在扩展已有的组件类,并添加或重写特定的功能以满足新的需求。

为了更好地理解组件继承,我们可以将其分解为几个关键步骤:

  • 类的定义 :首先定义一个基础类,这个类包含了所有组件共有的属性和方法。
  • 类的继承 :然后创建一个子类,该子类继承自基础类,并添加或重写所需的特性。
  • 组件的实例化 :最后,实例化这个子类,创建具体的组件对象。

5.1.2 组件继承中的常见问题和解决方案

在实现组件继承时,开发者可能会遇到一些常见的问题,如如何处理父类与子类之间的冲突,以及如何确保子类正确地继承父类的属性和方法。

一个常见的解决方案是使用 Ext.extend() 方法,这是EXTJS提供的一个工具方法,用于创建一个子类,继承一个已有的类。在使用 Ext.extend() 时,你需要注意以下几点:

  • 确保在子类中调用父类的构造函数,以初始化父类定义的属性。
  • 使用 callParent 方法在子类方法中调用父类的相应方法,以保证父类的功能不受影响。

5.2 实践中的组件继承

5.2.1 继承现有组件创建新组件

继承现有组件是一种常见的做法,可以帮助开发者快速扩展新功能。下面是一个简单的例子,展示了如何继承一个 Ext.grid.Panel 组件来创建一个具有额外功能的新组件:

Ext.define('MyApp.customGrid', {
    extend: 'Ext.grid.Panel',
    alias: 'widget.myCustomGrid',
    initComponent: function() {
        // 在这里添加额外的初始化代码
        this.callParent(); // 确保调用父类的初始化方法
    },
    // 添加新的方法或者覆盖父类的方法
    loadGridData: function() {
        this.store.load(); // 假设我们添加了一个加载数据的快捷方法
    }
});

通过上述代码,我们创建了一个新的组件 MyApp.customGrid ,它继承了 Ext.grid.Panel 的所有功能,并添加了一个 loadGridData 方法用于加载数据。

5.2.2 扩展第三方组件的实践

在某些情况下,我们可能需要扩展第三方提供的组件。EXTJS的类系统非常灵活,允许我们轻松地扩展第三方组件。

考虑一个场景,第三方组件 Ext.ux.SomeThirdPartyComponent 提供了大部分所需功能,但我们需要添加一个额外的事件处理。以下是扩展该组件的示例代码:

Ext.define('MyApp.addedEventComponent', {
    extend: 'Ext.ux.SomeThirdPartyComponent',
    alias: 'widget.addedeventcomponent',
    initComponent: function() {
        this.callParent(); // 调用父类的初始化代码
        this.on('someevent', this.handleSomeEvent, this); // 添加事件监听
    },
    handleSomeEvent: function() {
        // 处理someevent事件
    }
});

这段代码通过 initComponent 方法为第三方组件添加了一个新的事件处理函数 handleSomeEvent 。通过这种方式,我们可以利用EXTJS的继承机制来增强第三方组件的功能,而不必修改原始组件的代码。

以上两个例子均展现了EXTJS组件继承的强大能力和灵活性。通过理解和运用这些方法,开发者可以创建更加模块化和可复用的组件,显著提升开发效率和项目的可维护性。


# 6. JavaScript多态和动态类型的应用

## 6.1 多态在JavaScript中的表现

多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许不同类的对象对同一消息做出响应。在JavaScript这样动态类型的语言中,多态的特性更易得到体现。

### 6.1.1 多态的概念和在JavaScript中的应用

多态意味着对于多个形态(对象)的引用,使得一个接口可以被不同的实现所重用。在JavaScript中,因为函数和方法的动态特性,多态变得更加灵活和自然。例如,多个不同的对象可以拥有相同的函数名但实现不同功能。

```javascript
class Dog {
  speak() {
    console.log('Woof!');
  }
}

class Cat {
  speak() {
    console.log('Meow!');
  }
}

class Bird {
  // 不同的speak实现
  speak() {
    console.log('Chirp!');
  }
}

function makeNoise(animal) {
  animal.speak();
}

const dog = new Dog();
const cat = new Cat();
const bird = new Bird();

makeNoise(dog); // 输出: Woof!
makeNoise(cat); // 输出: Meow!
makeNoise(bird); // 输出: Chirp!

在上面的例子中, makeNoise 函数并不关心传入的是哪种动物,只要这个动物对象有 speak 方法即可。这就是多态的一个简单体现。

6.1.2 利用多态提高代码的复用性

多态使得代码具有更广泛的复用性。在JavaScript中,开发者可以编写通用的函数来处理不同类型的对象,只要这些对象符合预期的接口。这种做法不仅减少了代码的重复,也使得系统的扩展变得容易。

// 一个可以接受不同对象的打印函数
function printObjectInfo(obj) {
  console.log('Type: ' + typeof(obj));
  if (obj.printInfo) {
    obj.printInfo();
  }
}

// 不同对象的不同printInfo实现
class Person {
  printInfo() {
    console.log('This is a person.');
  }
}

class Vehicle {
  printInfo() {
    console.log('This is a vehicle.');
  }
}

const person = new Person();
const car = new Vehicle();

printObjectInfo(person); // 输出: Type: object 和 This is a person.
printObjectInfo(car);    // 输出: Type: object 和 This is a vehicle.

上述代码展示了如何使用多态来处理具有相同接口的不同对象,并且通过这种接口的抽象,增强了代码的灵活性。

6.2 动态类型的利与弊

JavaScript的动态类型特性,它既是优点也是缺点。其灵活性为快速开发和实验性编码提供了便利,但也为大型项目的维护带来了挑战。

6.2.1 动态类型语言的特点

动态类型语言,如JavaScript,在运行时确定变量的数据类型。这意味着变量可以在任何时候持有任何类型的数据。这种灵活性允许更快速地编写代码,因为类型声明和强制类型转换不是必需的。

let value = 42; // 初始为数字
value = "Hello World"; // 现在是字符串

然而,动态类型也意味着类型错误只有在运行时才能被发现,这可能会导致难以追踪的错误。

6.2.2 动态类型在EXTJS中的作用和影响

在EXTJS框架中,动态类型使得组件和类的扩展变得更加容易。开发者可以不必担心类型问题,专注于实现功能。然而,这种灵活性同样需要通过详尽的测试来确保运行时的稳定性。

// EXTJS中动态类型的应用
Ext.define('MyComponent', {
  extend: '***ponent',
  // 动态添加属性和方法
  setCustomProperty: function(value) {
    this.customProperty = value;
  }
});

EXTJS通过其组件和配置选项支持动态类型特性,允许开发者在组件创建后动态添加新的属性和方法。这种做法虽然灵活,但也要注意可能引入的类型错误。

总的来说,JavaScript和EXTJS的多态和动态类型特性为开发带来了极大的灵活性,但也需要开发者对代码质量负责,确保项目稳定运行。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:面向对象编程是JavaScript中的一种设计模式,EXTJS框架提供了强大的UI组件和数据绑定功能,其中面向对象和继承的概念尤为重要。本篇文章深入探讨了EXTJS中的类定义、继承实现、事件系统以及多态等面向对象基础和高级特性,揭示了EXTJS如何通过面向对象和继承机制来实现代码复用和模块化,以及这些机制在实际开发中的应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值