在ExtJS中,callParent()与initConfig对比超类

Pau*_*aul 14 model-view-controller extjs

这些片段之间有什么区别?:

constructor: function(config) {
    this.initConfig(config);
}

constructor: function(config) {
    this.callParent(arguments);
}

constructor: function(config) {
    this.superclass.constructor.call(this, config);
}
Run Code Online (Sandbox Code Playgroud)

并且,如何覆盖其他方法而不是constructor

Mat*_*eer 26

第二个和第三个片段在功能上是等效的.callParent只是一种更简洁,更简单的方法来调用父项的功能,而不是通过superclass属性.

第一个例子完全不同.首先,它不会调用父的构造函数.这通常是坏消息.基类通常有一些需要完成的初始化,而忘记为构造函数(和initComponent)调用父类是bug的常见来源.

initConfig 是一种方便的方法,将:

  • 将对象的初始配置与传入的配置合并
  • 为配置中的所有属性创建getter和setter
  • 将配置应用于对象

这与调用父构造函数完全不同.调用父构造函数的工作完全取决于它编写的内容.有些人会使用initConfig,有些人不会,有些人会做类似initConfig所做的事情,但需要手动.

它没有必要使用initConfig,有时甚至是危险的.但这完全是另一个故事(对于Ext 4.1,initConfig看起来有希望无害,并且不包含与4.0相同的危险副作用)

边注

只是要指出.在第二个和第三个片段中,不需要构造函数.如果你的构造函数只调用父的构造函数,那么你可以完全抛弃你的构造函数.

  • 在分析了一些Ext源代码并测试之后:1.如果你没有扩展任何类,你必须调用`Ext.apply(this,config || {})`而不是`this.callParent(arguments)`,否则`Ext. create('class',{config})`将不会被应用.2.如果你从大多数Ext类(或你自己的父类)扩展,调用`this.callParent(arguments)`就足够了,因为从Ext.Base扩展的父类已经调用了`Ext.apply(this,config) || {})`3.大多数Ext源调用`this.callParent([config])`来显式允许配置并丢弃其他参数. (5认同)