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()

これについての私の考えは、自己がオブジェクトのクラスを参照しているため、これを行う必要がある唯一の理由は、 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.myCurrentRecursiveMethod(params))

于 2013-04-16T14:23:52.083 に答える