什么时候把自己和什么时候放在Ext-JS 4中?

时间:2012-11-16 06:41:43

标签: javascript extjs extjs4

考虑一下这个例子:

http://docs.sencha.com/ext-js/4-1/#!/api/Ext.app.Application-static-method-getName

Ext.define('My.cool.Class', {
    constructor: function() {
        alert(this.self.getName()); // alerts 'My.cool.Class'
    }
});

My.cool.Class.getName(); // 'My.cool.Class'

此示例中引用的self是什么? 在本文档中,我如何知道何时使用this以及何时使用selfthis.self? 为什么这不起作用:

this.getName()

self.getName()

我对此的想法是self指的是对象的类,所以我需要这样做的唯一原因是因为getName()方法是静态的所以我(有点)不是从对象调用它,而是从类。我对吗?我呢?哈?哈?我呢? :d

2 个答案:

答案 0 :(得分:6)

this.self指的是类对象。这意味着this.self === My.cool.Class。因此,您可以通过调用My.cool.Class来实例化新的new this.self()对象。

this.getName()不起作用的原因是因为JS中的静态属性/方法在实例中不可用。

示例:

var Class = function(){};
Class.prototype = {};

Class.staticMethod = function(){ alert('static method'); };
Class.prototype.instanceMethod = function(){ alert('instance method'); };

var instance = new Class();

Class.staticMethod(); // works
Class.instanceMethod(); // doesn't work

instance.staticMethod(); // doesn't work
instance.instanceMethod(); // works

即使在静态上下文中,子类中也不提供静态属性/方法。

示例:

Ext.define('One', {
    instanceMethod: function() { alert('Instance One'); }
});
Ext.apply(One, {
    staticMethod: function() { alert('Static One'); }
});


Ext.define('Two', {
    extend: 'One'
});


One.staticMethod(); // works
Two.staticMethod(); // doesn't work

getNameMy.cool.Class方法可用的原因是因为Ext.Base方法中的ExtClass.create类已复制(此类是私有的,因此在API中不可见) )。     

答案 1 :(得分:0)

this.self不适用于递归静态方法,以递归方式调用静态方法只需要使用它(即this.myCurrentRecursiveMethod(params))