検索
ホームページウェブフロントエンドjsチュートリアルExtjs 学習ノート 8: 継承とイベントの基礎_extjs

ここでのインターフェイスの意味は、Observable が実際には Extjs の多数のコンポーネントがこのクラスから継承するということです。このクラスは、addEvents、addlistener、fireEvent などのいくつかの基本メソッドを提供します。

この記事では、extjs コンポーネントを使用してイベントに応答する方法を紹介するのではなく、Extjs イベントの実装原則をいくつか紹介します。 Extjs フレームワーク全体はオブジェクト指向で開発されているため、JavaScript の継承を理解することも重要です。前回の記事はこの記事の準備でもありました。さらに、ブログ パークには、よく書かれたシリーズ JavaScript 継承の詳細な説明 があり、主に Douglas Crockford による 2 つの記事に基づいています。 実際、継承を実装するための原則は似ているため、参照として読むことができます。 Extjs によって継承された関数は非常にコアな関数 Ext.extend です。extend メソッドには 2 つのリファクタリングされたバージョンがあり、最初のものは extend(Function superclass, Object overrides) です。 2 番目のバージョンは extend(Function subclass, Function superclass,Object overrides): Function です。2 番目のバージョンはサブクラスに基づいています。スーパークラスはスーパークラスのコンストラクターであり、オーバーライドはオブジェクトであり、内部の属性は親クラスの属性をオーバーライドします。親クラスを継承するサブクラスには、親クラスのプロトタイプ内のすべてのメソッドが含まれます。また、サブクラスは親クラスのメソッドをオーバーライドすることができます (オーバーライド)。また、サブクラスの各オブジェクトも親クラスのメソッドをオーバーライドできます。実際、この関数には何の効果もないと思います。もちろん、extjs の目的は、プロトタイプという魔法のようなものを完全に保護して、プログラマが他の言語と同じように JavaScript を処理できるようにすることです。もちろん、そうであっても、その継承は通常の継承とは多少異なります。まず、例を見てみましょう。


コードをコピーします。 🎜 > コードは次のとおりです。 person = function(name) { this.name = name;
this.fn = function() {alert('私は人間です ') };
}
person.prototype.print=function(){alert('私は人間です');}
person.prototype.showAge = function() {alert ('私は 0 歳以上です'); }
person.prototype.showName = function() {alert('Show Name:' this.name) };
var per = new Person('Tom') ;
per.showName(); サブクラス: Student = function(id) {
this.id = id;
Student.prototype.showID = function() { ); } //サブクラスのメソッド


継承:
Extend(Student, Person); !!結果はありません! stu には名前の定義がありません stu.fn(); !!結果がありません stu.showID(); !!!まだ結果がありません この時点で、いくつかの違いが見つかりました: 親クラスのコンストラクターの内容は継承されません. の場合、親クラスのコンストラクターは呼び出されず、サブクラス (プロトタイプ内の) の既存のメソッドも失われます。読み続けて、Ext.extend の下のコードを次のコードに置き換えます:



コードをコピーします


ここでの関数はすべて、親クラスの実行メソッドであり、stu. print は .override で指定されたメソッドを実行する stu であり、stu2 は Student.override で指定されたメソッドを実行します。この時点で、extend がどのように実装されるかを大まかに推測できます。以下の実際のソース コードを見てみましょう。このメソッドは Ext.js にあります。コードとコメントは次のとおりです。extend : function(){




Copy code

コードは次のとおりです:

// inline overrides
var io = function(o){ //このメソッドは一見しただけではわかりません。次の io が割り当てられます。 sbp.override 、つまりサブクラスのプロトタイプ
for(var m in o){ //各サブクラス オブジェクトのオーバーライドは、このメソッドを指します。サブクラス オブジェクトが override を呼び出す場合、これは のオブジェクトです。サブクラス。つまり、
this[m] = o[m]; //上記の例で stu.override によって示された効果は、現在のオブジェクトに対してのみ有効です。ここから、オーバーライドは従来の意味でのオーバーライドであるだけでなく、
} // 新しいメソッドを追加するためにも使用できることがわかります。
};
var oc = Object.prototype.constructor;

return function(sb, sp, overrides){
if(Ext.isObject(sp)){ //現在使用されているリファクタリング関数のバージョンを検出します。 sp が実際にオーバーライドする場合は、変数の実際の意味がその名前と一致するようにいくつかの置換を実行します。
overrides = sp;
sp = sb;
sb = overrides.constructor != oc ? overrides.constructor : function(){sp.apply(this, argument);};これを読んでください...
}
var F = function(){},
sbp,
spp = sp.prototype;

F.prototype = spp; /F は親です。 クラスの「クリーン」コピー。クリーンとは、親クラスのコンストラクター内で定義されたプロパティを引き継がないことを意味します。 //たとえば、 Person=function() // {this.privateFn=new function{ some code go here}} // この privateFn はサブクラスには見えないため、コンストラクターでこれを使用して定義された属性は、次のプライベート変数と同等です。クラス。
sbp = sb.prototype = new F(); //サブクラスのプロトタイプを親クラスのプロトタイプに設定します。これは継承の中心的なステップです。 sbp.constructor=sb; //正しいコンストラクター ポインターを設定します。JavaScript 継承の詳細を参照してください
sb.superclass=spp; //親クラスを設定します
if(spp.constructor == oc){ //Didn'読んでいません、わかりました...、これは何のためにあるのですか?アドバイスをお願いします。
spp.constructor=sp;
}
sb.override = function(o){ //サブクラスの書き換えメソッド、この書き換えメソッドは関数の書き換えメソッドです。プロトタイプを修正します。
Ext.override(sb, o); //最後を参照。
};
sbp.superclass = sbp.supr = (function(){ //プロトタイプの親クラスを設定します。
return spp;
sbp.override = io ; // 単一のエンティティをオーバーライドできるように、サブクラスのプロトタイプにオーバーライド メソッドを提供し、エンティティ オブジェクトを変更します。上記の sb のオーバーライドとの違いに注意してください。
Ext.override(sb, overrides); //
sb.extend = function(o){return Ext.extend(sb, o);} //複数のサブクラスを実装するための extend メソッドを提供します。継承
return sb; // サブクラスを返します。
};
}();

以下は、インライン オーバーライドと比較して比較的明確な、変更された prototype:override のコードです。

コードをコピー コードは次のとおりです。
function(origclass, overrides){
if(overrides) {
var p = origclass.prototype;
Ext.apply(p, overrides);
if(Ext.isIE && overrides.hasOwnProperty('toString')); //これですか? IE の特別な点は何ですか?
p.toString = overrides.toString;
}
}
}

これで、Extjs のイベント モデルの正式な導入を開始できます。他の言語のイベントと同様に、最初にクラスのイベントを定義する必要があります。他の言語 (C# など) のイベントには通常、イベント タイプはデリゲートの配列と見なされます。 、デリゲートは実際には関数です。Add 時間リスナー (リスナー) は、デリゲート配列にデリゲート (関数) を追加したいだけです。いわゆるトリガー イベントは、配列内のすべての関数を実行することです。 Javascript も同様ですが、JavaScript の関数はこれらの言語よりもはるかに強力で柔軟であるため、イベント タイプが必要ありません。 Javascript イベントは文字列のように見えます (内部的に配列も保持する必要があります)。Observale.addEvents メソッドを通じてイベントを追加し、Observale.fireEvent を通じてイベントをトリガーし、Observale.addListner を通じてイベント リスナーを追加できます。以下に、ほとんど意味はありませんが、問題を説明する例を示します。

コードをコピー コードは次のとおりです。
Odder = function(min, max) {
this.min = min;
this.addEvents('onFindOdd');
}
Ext.extend(Odder, Ext.util.Observable, { run:
function() {
for (var i = this.min; i if (i % 2 != 0) {
this.fireEvent ('onFindOdd ',i);
}
}
});
var p = new Odder(4, 8); ,function(n){alert(n);});
p.run();
Odder は、コンストラクターを介して範囲を渡し、範囲内のすべての奇数を検索し、奇数が見つかるたびにイベントをトリガーするクラスです。これにイベント ハンドラーを追加して、見つかった奇数を警告します。 ここでのイベント ハンドラーのパラメーターはプログラマによってのみ一貫性を保つことができ、デリゲートほど厳密に型指定されないことに注意してください。

公式 Web サイトの例は使用していないことに注意してください:
コードをコピーします コードは次のとおりです。

Employee = Ext.extend(Ext.util.Observable, {
constructor: function(config){
this.name = config.name;
this. addEvents({
" fired" : true,
"quit" : true
});

// 構成されたリスナーを *this* オブジェクトにコピーして、基本クラスの
// コンストラクターがそれらを追加します。
this.listeners = config.listeners;

// スーパークラス コンストラクターを呼び出して構築プロセスを完了します。 >}
}) ;これは次のように使用できます:
var newEmployee = new Employee({
name:employeeName,
listeners: {
quit:function() {
// デフォルトでは、「this」はイベントを起動したオブジェクトになります。
alert(this.name " has quit!")
}
}


i 公式 Web サイトの例に記事があると思います。そのオーバーロードされた項目には、親クラスのコンストラクターがオーバーロードされ、サブクラスがこれを呼び出すという印象を与えます。実際、これは、JavaScript 自体の動作を変更するものではありません。これは、私が理解できなかった、上でマークしたコードの数行に関連しています。詳しい議論は次回に。
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
解决PHP报错:继承父类时遇到的问题解决PHP报错:继承父类时遇到的问题Aug 17, 2023 pm 01:33 PM

解决PHP报错:继承父类时遇到的问题在PHP中,继承是一种重要的面向对象编程的特性。通过继承,我们能够重用已有的代码,并且能够在不修改原有代码的情况下,对其进行扩展和改进。尽管继承在开发中应用广泛,但有时候在继承父类时可能会遇到一些报错问题,本文将围绕解决继承父类时遇到的常见问题进行讨论,并提供相应的代码示例。问题一:未找到父类在继承父类的过程中,如果系统无

如何在PHP中使用多态和继承来处理数据类型如何在PHP中使用多态和继承来处理数据类型Jul 15, 2023 pm 07:41 PM

如何在PHP中使用多态和继承来处理数据类型引言:在PHP中,多态和继承是两个重要的面向对象编程(OOP)概念。通过使用多态和继承,我们可以更加灵活地处理不同的数据类型。本文将介绍如何在PHP中使用多态和继承来处理数据类型,并通过代码示例展示它们的实际应用。一、继承的基本概念继承是面向对象编程中的一种重要概念,它允许我们创建一个类,该类可以继承父类的属性和方法

使用继承的Java程序来计算定期存款(FDs)和定期存款(RDs)的利息使用继承的Java程序来计算定期存款(FDs)和定期存款(RDs)的利息Aug 20, 2023 pm 10:49 PM

继承是一个概念,它允许我们从一个类访问另一个类的属性和行为。被继承方法和成员变量的类被称为超类或父类,而继承这些方法和成员变量的类被称为子类或子类。在Java中,我们使用“extends”关键字来继承一个类。在本文中,我们将讨论使用继承来计算定期存款和定期存款的利息的Java程序。首先,在您的本地机器IDE中创建这四个Java文件-Acnt.java−这个文件将包含一个抽象类‘Acnt’,用于存储账户详情,如利率和金额。它还将具有一个带有参数‘amnt’的抽象方法‘calcIntrst’,用于计

PHP中的封装技术及应用PHP中的封装技术及应用Oct 12, 2023 pm 01:43 PM

PHP中的封装技术及应用封装是面向对象编程中的一个重要概念,它指的是将数据和对数据的操作封装在一起,以便提供对外部程序的统一访问接口。在PHP中,封装可以通过访问控制修饰符和类的定义来实现。本文将介绍PHP中的封装技术及其应用场景,并提供一些具体的代码示例。一、封装的访问控制修饰符在PHP中,封装主要通过访问控制修饰符来实现。PHP提供了三个访问控制修饰符,

PHP中的多重继承PHP中的多重继承Aug 23, 2023 pm 05:53 PM

继承:继承是面向对象编程(OOP)中的一个基本概念,它允许类从其他类继承属性和行为。它是一种基于现有类创建新类的机制,促进代码重用并建立类之间的层次关系。继承基于"父子"或"超类-子类"关系的概念。从中继承的类被称为超类或基类,而继承超类的类被称为子类或派生类。子类继承其超类的所有属性(变量)和方法(函数),还可以添加自己独特的属性和方法或覆盖继承的属性和方法继承的类型在面向对象编程(OOP)中,继承是一个基本概念,它允许类从其他类中继承属性和行为。它促进

如何使用Java强制继承代理final类?如何使用Java强制继承代理final类?Sep 06, 2023 pm 01:27 PM

如何使用Java强制继承代理final类?在Java中,final关键字用于修饰类、方法和变量,表示它们不可被继承、重写和修改。然而,在某些情况下,我们可能需要强制继承一个final类,以实现特定的需求。本文将讨论如何使用代理模式来实现这样的功能。代理模式是一种结构型设计模式,它允许我们创建一个中间对象(代理对象),该对象可以控制对另一个对象(被代理对象)的

继承、多态与接口:PHP面向对象的三大特性继承、多态与接口:PHP面向对象的三大特性May 11, 2023 pm 03:45 PM

PHP是一种服务器端编程语言,自PHP5之后开始支持面向对象编程(OOP)。OOP的核心思想是将数据和行为封装在对象中,以提高程序的可维护性和可扩展性。在PHP中,面向对象编程具有三大特性:继承、多态与接口。一、继承继承是指一个类可以从另一个类中继承属性和方法。被继承的类称为父类或基类,继承的类称为子类或派生类。子类可以通过继承获得父类中的属性和方法,并且可

如何在Go语言中实现封装和继承如何在Go语言中实现封装和继承Jul 23, 2023 pm 08:17 PM

如何在Go语言中实现封装和继承封装和继承是面向对象编程中的两个重要概念,它们可以使代码更加模块化和可维护,同时也为代码的复用提供了便利。本文将介绍在Go语言中如何实现封装和继承,并提供相应的代码示例。封装封装是将数据和功能进行封装,隐藏实现的细节,只暴露必要的接口给外部使用。在Go语言中,封装是通过导出和非导出标识符来实现的。首字母大写的标识符可以被其他包访

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境