3

考虑这个例子:

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以及何时self何地this.self?为什么这不起作用:

this.getName()

或者

self.getName()

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

4

2 回答 2

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

getName方法可用的原因是因为方法中的类是从类中My.cool.Class复制的(该类是私有的,在API中不可见)。​</p> Ext.BaseExtClass.create

于 2012-11-16T08:57:27.567 回答
0

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

于 2013-04-16T14:23:52.083 回答