我读过的所有ExtJS文档和示例都建议调用这样的超类方法:
MyApp.MyPanel = Ext.extend(Ext.Panel, {
initComponent: function() {
// do something MyPanel specific here...
MyApp.MyPanel.superclass.initComponent.call(this);
}
});
Run Code Online (Sandbox Code Playgroud)
我已经使用这种模式很长一段时间了,主要的问题是,当你重命名你的类时,你还必须改变所有对超类方法的调用.这很不方便,经常我会忘记,然后我必须追查奇怪的错误.
但是看完来源Ext.extend()
,我发现,这不是我可以使用superclass()
或super()
该方法Ext.extend()
增加了原形:
MyApp.MyPanel = Ext.extend(Ext.Panel, {
initComponent: function() {
// do something MyPanel specific here...
this.superclass().initComponent.call(this);
}
});
Run Code Online (Sandbox Code Playgroud)
在这个代码中,将MyPanel重命名为其他东西很简单 - 我只需更改一行.
但我怀疑......
我没有在任何地方看到过这种情况,旧的智慧说,我不应该依赖于无证件的行为.
我没有在ExtJS源代码中找到这些superclass()
和supr()
方法的单独使用.为什么在你不打算使用它们时创建它们?
也许这些方法在某些旧版本的ExtJS中使用但现在已被弃用?但它似乎是一个非常有用的功能,你为什么要弃用呢?
那么,我应该使用这些方法吗?
在extjs中,你总是可以通过扩展extjs类constructor()
.对于从Component
你那里学习的课程也可以延伸initComponent()
.
我想知道为什么这么多代码扩展通过initComponent
,而constructor
似乎是通用扩展方法.是否initComponent
提供明显的优势了constructor
?
我正在尝试学习ExtJS和面向对象的JavaScript.我已经看到人们通过几种方式在自定义命名空间中定义类.这两种方法有什么区别?
方法1
Ext.ns('myapp.cars');
(function(){
var Car = Ext.extend(Object, {
//...
})
myapp.cars.Car = Car;
})()
Run Code Online (Sandbox Code Playgroud)
方法2
Ext.ns('myapp.cars');
myapp.cars.Car = Ext.extend(Object, {
//...
});
Run Code Online (Sandbox Code Playgroud)
方法2更易于阅读,所需代码更少; 有什么理由方法1更好吗?谢谢!
我做的一些研究ExtJS的论坛,关于私有方法和字段一个内部扩展类的,我无法找到任何真正的答案.
当我说一个扩展课程时,我的意思是这样的:
Ext.ux.MyExtendedClass = Ext.extend(Ext.util.Observable, {
publicVar1: 'Variable visible from outside this class',
constructor: function(config) { this.addEvents("fired"); this.listeners = config.listeners; }, // to show that I need to use the base class
publicMethod1: function() { return 'Method which can be called form everywhere'; },
publicMethod2: function() { return this.publicMethod1() + ' and ' + this.publicVar1; } // to show how to access the members from inside another member
});
Run Code Online (Sandbox Code Playgroud)
这里的问题是一切都是公开的.那么,如何在MyExtendedClass范围内添加一个新的变量o方法,该方法无法从外部访问但可以通过公共方法访问?
在我目前的项目中,我使用的是ExtJs3.3.
我创建了许多具有私有变量和函数的类.例如:
MyPanel = function(config){
config = config || {};
var bar = 'bar';//private variable
function getBar(){//public function
return bar;
}
function foo(){
//private function
}
Ext.apply(config, {
title: 'Panel',
layout: 'border',
id: 'myPanel',
closable: 'true',
items: []
});
MyPanel.superclass.constructor.call(this, config);
};
Ext.extend(MyPanel , Ext.Panel, {
bar: getBar
});
Ext.reg('MyPanel', MyPanel);
Run Code Online (Sandbox Code Playgroud)
我知道在ExtJs4中做事的新方法是使用该Ext.define
方法.因此,我上面的代码看起来像这样:
Ext.define('MyPanel', {
extend: 'Ext.panel.Panel',
title: 'Panel',
layout: 'border',
closable: true,
constructor: function(config) {
this.callParent(arguments);
},
});
Run Code Online (Sandbox Code Playgroud)
所以我想知道的是如何在ExtJs4中定义私有变量和函数,类似于我在ExtJs3中的方式?
换句话说,我理解该Ext.define
方法将负责定义,扩展和注册我的新类,但是我应该在哪里声明javascript var
,它们不是类本身的属性,而是类所需要的.
MyPanel = function(config){
//In …
Run Code Online (Sandbox Code Playgroud) 我们在旗舰应用程序中使用ExtJS 3.x.我们的应用程序管理区域分为我们提供的不同模块.每个模块以及随后模块的不同CRUD操作的每个页面都有自己的.js文件来处理功能.
当我们开始时,我们只是将所有代码抛入Ext.onReady()
并且并不真正担心全局命名空间(嘿......我们从未真正将自己视为javascript开发人员).在获得ExtJS之后,我开始使用单例模式并从中调用init方法Ext.onReady()
.
var newModule = {
propertyOne: 'asfd',
propertyTwo: 'asdf',
init: function() {
// set up
}
};
Ext.onReady(function() {
newModule.init();
});
Run Code Online (Sandbox Code Playgroud)
这是javascript单例模式的正确使用吗?是否有任何模式适合ExtJS比单例更好,比如说模块模式?
我一直在使用本指南作为学习Javascript设计模式的起点.
extjs ×6
javascript ×5
extjs3 ×3
extend ×2
extjs4 ×1
inheritance ×1
module ×1
private ×1
singleton ×1
superclass ×1