考虑一下这个例子:
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
答案 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
在getName
中My.cool.Class
方法可用的原因是因为Ext.Base
方法中的ExtClass.create
类已复制(此类是私有的,因此在API中不可见) )。
答案 1 :(得分:0)
this.self不适用于递归静态方法,以递归方式调用静态方法只需要使用它(即this.myCurrentRecursiveMethod(params))