JavaScript 関数、オブジェクトの作成、カプセル化、プロパティとメソッド、inheritance_javascript スキル
1. 関数
js に触れた当初からとても柔軟に感じます。例えば、関数
の書き方は N 種類あります。 例: function showMsg(){ }, var showMsg=function( ){}, showMsg=function(){}
違いはないようですが、本当に同じですか?
///-------- ------------ -------------------------------------- ------------ -------
-------
//関数定義: 名前付き関数 (宣言型)、匿名関数 (参照式)
//宣言型、関数実行コードの前に定義コードが解析されます。
function t1(){
dwn("t1"); >}
t1();
function t1(){
dwn("new t1")
}
//実行中に動的に解析される参照型関数操作
var t1=function (){
dwn("新しい新しい t1");
}
t1();
var t1=function(){
dwn( "new new new t1");
}
t1()
//上記の出力: new t1、new t1、new new t1
おそらく出力 t1、new t1、new newt1、new new new t1 になるはずですが、結果は次のようなものではないことを理解してください: 宣言
式、定義コードは関数の前に解析されます。実行コード
もう一歩深く言えば、スコープチェーンの問題と言えます。実際、最初の 2 つのメソッドは window.t1 に相当します。t1 は window のパブリック プロパティに割り当てられていることがわかります。 >後の 2 つのメソッドは t1 が変数であると理解でき、var を削除した後の 4 番目のメソッドの結果は変わりません
ただし、4 番目のメソッドの場合はfunction t1(){} のような文に変更されます。式を実行すると、結果は new new new t1,new new new
t1,new new t1,new new t1
私の理解によれば、最初の 2 つは、この答えがなぜそうなのかよく理解できます。 3 つ目も理解できますが、最後の出力は
よりも混乱します。それに答えられる専門家がいることを願っています
さらに、 (function(){...})() などの匿名関数 書き方としては、最後の括弧がパラメータ入力
に使われており、var t1=new function(){..} のような記述があります。実際、t1 はすでにオブジェクトです
例:
コードをコピー
alert (typeof(t2)) //object
alert(t2.constructor()); >さらに、システム組み込み関数オブジェクトを使用して関数を構築することもできます。例:
var t3 = new Function('var temp = 100; this.temp = 200; return temp this.temp ;'); //この位置に new が追加されているかどうかに関係なく、結果は同じです。なぜ
alert(typeof(t3)) //function
alert(t3()); 🎜>
2 番目に、オブジェクトを作成します
まず、オブジェクト指向プログラミング (OOP) について理解します。OOP テクノロジでは、多くの
コード モジュールが使用されます。各モジュールは、それぞれ特定の機能を提供します。他のモジュール
から隔離されているか、完全に独立している場合もあります。このモジュール式プログラミングのアプローチにより、優れた多様性が提供され、コードを再利用する機会が大幅に増加します。この問題
をさらに詳しく説明するために、コンピューター上の高性能アプリケーションが一流のレーシング カーであると仮定します。従来のプログラミング手法を使用すると、自動車は
単一ユニットになります。車を改善したい場合は、ユニット全体を交換するか、メーカーに送り返して車の専門家にアップグレードしてもらうか、新しい
車を購入する必要があります。 OOP テクノロジーを使用すると、弓のこで車体を切断する必要がなく、メーカーから新しいエンジンを購入し、指示に従って自分で交換するだけで済みます。
しかし、議論のほとんどは、JavaScript は直接的なオブジェクト指向言語ではないが、シミュレーションを通じてオブジェクト指向言語が実行できる多くのこと (継承など) を実行できるというものです。
ポリモーフィズム、カプセル化、JavaScript ならできます (不可能ではありません。思いつかないだけです)
コードをコピー
コードは次のとおりです:
function Point(x,y){ //C# クラスと同様
this.x=x;
}
var p=new Point(1, 2); //クラスをインスタンス化します
最初のメソッドは、基本オブジェクトを構築し、属性を直接追加することによって実装されます。2 番目のメソッドは、最初のメソッドと同様であり、最初のメソッドのショートカット表現とみなすことができます。
3 番目の方法では、「クラス」に基づいて同じタイプの複数のオブジェクトを作成できます
3. オブジェクト属性 (パブリックおよびプライベート) のカプセル化
例付きの図
function List (){
var m_elements=[]; //ここで var 宣言がない場合は、m_elements がグローバル変数
になり、alert などの外部から直接アクセスできます。 (m_elements[0])
m_elements=Array .apply(m_elements,arguments);
//使用時にゲッターをシミュレートします。 alist.length;
//getName() メソッドと同等: this.length=function(){return m_elements .length;},使用時
alist.length();
//パブリック プロパティには、「.」演算子または添え字
this.length={
valueOf:function(){
return m_elements.length;
},
toString:function(){
return m_elements.length;
}
}
//このメソッドは、alert( alist) は、alert(alist.toString()) と同等です。
this.toString=function(){
return m_elements.toString();
}
// パブリック メソッド
this .add=function(){
m_elements.push.apply(m_elements,arguments);
}
//プライベートメソッドはクロージャの概念を含む次の形式です。続きの説明を続けましょう
//var add=function() または function add()
//{
//m_elements.push.apply(m_elements,arguments)
//}
}
var alist=new List(1,2,3);
dwn(alist); //=alert(alist.toString())、出力 1,2,3
dwn(alist.length); //出力 3
alist.add(4,5,6);
dwn(alist); //出力 1,2,3,4,5,6
dwn(alist.length); //出力 6
4. プロパティとメソッドの種類
JavaScript では、オブジェクトのプロパティとメソッドは、プライベート プロパティ (プライベート プロパティ)、動的パブリック
の 4 つの異なるタイプをサポートします。プロパティ (動的パブリック プロパティ)、静的パブリック プロパティ/プロトタイプ プロパティ (静的パブリック プロパティまたはプロトタイプ プロパティ)、
静的プロパティ (静的プロパティまたはクラス プロパティ)。プライベート プロパティは外部からは完全にアクセスできず、内部ゲッターと
セッターを介してアクセスできます (どちらもシミュレーションです)。動的パブリック プロパティは外部からアクセスでき、各オブジェクト インスタンスはコピーを保持します。相互に影響しません。プロトタイプ
の属性は、各オブジェクト インスタンスと一意のコピーを共有します。インスタンスの属性としては使用されず、クラスの属性としてのみ使用されます。
以下は例です:
///-- ------------------------------------------- ----- -------------------------------------
-- ----
//動的パブリック型、静的パブリック型 (プロトタイプ プロパティ)
function myClass(){
var p=100; //プライベート プロパティ
this.x=10; /dynamic public property
}
myClass.prototype.y=20; //static public プロパティまたはプロトタイプ プロパティ。
プロパティを myClass のプロトタイプに動的に追加し、インスタンス化されたすべてのオブジェクトに適用されます。ここではプロトタイプが使用されていることに注意してください。これは非常に便利です。
//高度な JavaScript ステージになるには、プロトタイプとクロージャーを理解し、適切に適用する必要があります。
myClass.z=30; //static property
var a=new myClass();
dwn(a.p) //未定義
dwn(a.x) //10
dwn(a.y) //20
a.x=20; 🎜>a.y=40;
dwn(a.x); //20
dwn(a.y); // オブジェクト a の属性 x を削除します。 a.y); //オブジェクト a の属性 y を削除します
dwn(a.x); //未定義
dwn(a.y); //20 静的パブリック属性 y をプロトタイプ属性 y
dwn に戻します(削除後 a.z); //未定義のクラス属性にはオブジェクトを通じてアクセスできません
5. プロトタイプ (prototype)
の一部のみです。ここで説明する、プロトタイプとクロージャは両方ともです。これは、ほんの数語で明確に説明できるものではありません。これがあなたに何らかの啓発を与えることができれば、あなたは幸運です
「猫を撮って虎を描く」という慣用句のように、ここでの猫はプロトタイプ、トラはタイプであり、次のように表現できます: Tiger.prototype=someone cat または
プロトタイプのプロパティは固有のオブジェクト インスタンスごとにコピーします。インスタンスの 1 つがプロトタイプ プロパティの値を調整すると、すべてのインスタンスが調整されます
この属性を使用するたびに、これに注意する必要があります
次は型チェーンですプロトタイプ関係の:
コードをコピー
関数 ClassA(){
}
ClassA.prototype=new Object();
関数 ClassB(){
}
ClassB.prototype=new ClassA() ;
function ClassC(){
}
ClassC.prototype=new ClassC();
var obj=new ClassC(); //true
dwn(objinstanceofClassB); //true
dwn(objinstanceofObject); //true
デフォルト値のポイントオブジェクト:
function Point2(x,y){
if (x) this.x=x;
if (y) this.y=y;
}
//Point2 オブジェクトの x を設定します、y のデフォルト値は 0 です
Point2.prototype.x=0
//p1 はデフォルト (0,0) オブジェクトです
var p1 = new Point2(); //var p1=new Point2 はエラーなく書けますが、なぜ
//P2 割り当て
var p2=new Point2(1,2); ," p1.y); //0,0
dwn(p2.x "," p2.y); //1,2
オブジェクトのプロパティを削除すると、プロトタイプのプロパティは に戻ります。初期化された状態:
function ClassD(){
this.a=100;
this.c=300
}
ClassD.prototype=new ClassD() ; //その値を含む、ClassD の元のプロパティをプロトタイプとして設定します
ClassD.prototype.reset=function(){ //(この中の var each) の非プロトタイプ プロパティを削除します{
これを削除します
}
}
var d=new ClassD()
d.a); //100
d.a*=2; >d.b*= 2;
dwn(d.a) //400
dwn(d.c); d.reset( ); //非プロトタイプ属性を削除し、すべてのプロトタイプを返します。
dwn(d.b); //200
dwn(d.c);
6. 継承
2 つのクラスが同じインスタンス型である場合、それらの間には特定の関係が存在します。
その関係。を継承といいます。これは C# と JAVA の両方で利用できるため、具体的な理解には立ち入りません。
JavaScript ではメソッドからの継承は直接サポートされていませんが、前述したように、メソッドは構築継承、プロトタイプ継承、インスタンス継承、コピー継承の 4 つのタイプに要約できます。マスターした後は、混合継続
方法もあります。これは何ですか? 前の 4 つからいくつかを選択して混合する方法です。
次の例は、Return of the King からのものです。これには、apply、call などが含まれます。Array の使用法に興味がある場合は、庭
1 で
コードをコピー
コードは次のとおりです:
//コレクション型を定義します
関数 Collection(size)
{
{
var m_elements = []; //プライベートメンバーは継承できません
m_elements = Array.apply(m_elements, argument);
//ArrayList 型はコレクションを継承します
this.base = Collection ;
this.base.call(this, m_elements.length );
this.add = function()
{
return m_elements.push.apply(m_elements, argument); 🎜>}
this.toArray = function()
{
return m_elements;
}
}
ArrayList.prototype.toString = function()
{
return this.toArray().toString();
}
//ArrayList 型を継承する SortedList 型を定義します。
関数 SortedList()
{
// SortedList 型は ArrayList を継承します。
this.base = ArrayList;
this.sort = function()
{
var arr = this.toArray();
arr.sort.apply(arr, argument);
}
}
//ArrayList を構築します
var a = new ArrayList(1, 2,3);
dwn(a);
dwn (a.size()); //a は Collection
dwn(a.isEmpty) から継承します。 isEmpty() メソッドを継承しません
//SortedList を 1 つ作成します
var b = new SortedList(3,1,2); //b ArrayList から add() メソッドを継承
dwn(b.toArray() ); //b ArrayList から toArray() メソッドを継承
b.sort() メソッド
dwn(b.toArray());
dwn(b );
dwn(b.size()); //b はコレクション
から継承します🎜>2、プロトタイプ継承の例:
コードをコピー
コードは次のとおりです:
//Define a Point type
function Point(dimension)
{
this.dimension = dimension;
}
//Define a Point2D type, "inherits" Point type
function Point2D(x, y)
{
this.x = x;
this.y = y;
}
Point2D.prototype .distance = function()
{
return Math.sqrt(this.x * this.x this.y * this.y);
}
Point2D.prototype = new Point(2) ; //Point2D inherits Point
//Define a Point3D type and also inherits Point type
function Point3D(x, y, z)
{
this.x = x;
this.y = y;
this.z = z;
}
Point3D.prototype = new Point(3); //Point3D also inherits the Point
//construction A Point2D object
var p1 = new Point2D(0,0);
//Construct a Point3D object
var p2 = new Point3D(0,1,2);
dwn( p1.dimension);
dwn(p2.dimension);
dwn(p1 instanceof Point2D); //p1 is a Point2D
dwn(p1 instanceof Point); //p1 is also a Point
dwn(p2 instanceof Point); //p2 is a Point
The above two methods are the most commonly used
3, instance inheritance method example:
Before talking about this method example, Let’s talk about the limitations of the construction inheritance method, as follows:
function MyDate ()
{
this.base = Date;
this.base.apply(this, arguments);
}
var date = new MyDate();
alert(date .toGMTString); //undefined, date does not inherit from the Date type, so there is no toGMTString method
Some methods of the core object cannot be inherited by the constructor because the core object is not as customized as ours How about
performing assignment or initialization operations
in the constructor like a normal object and replacing it with prototypal inheritance? , as follows:
function MyDate(){}
MyDate.prototype=new Date();
var date=new MyDate();
alert(date.toGMTString); //'[object]' is not a date object, and it still does not inherit the Date type!
Now, switch to instance inheritance:
function MyDate()
{
var instance = new Date(); //instance is a newly created date object
instance.printDate = function(){
document. write("
" instance.toLocaleString() "
");} //Extend the printDate() method to instance
return instance; //Return instance as the constructor Value return
}
var myDate = new MyDate();
dwn(myDate.toGMTString()); //The correct time string was successfully output this time. It seems that myDate is already a Date. Instance
, inheritance successful
myDate.printDate(); //If there is no return instance, it cannot be accessed with subscripts, because it is a private object method
4, copy inheritance method Example:
Function.prototype.extends = function(obj)
{
for(var each in obj)
{
this.prototype[each] = obj[each];
//Copy the properties of the object one-to-one, but It is slow and prone to problems
//So this "inheritance" method is generally not recommended
}
}
var Point2D = function(){
//...
}
Point2D.extends(new Point())
{
//...
}
This inheritance method seems to be rarely used.
5, mixed inheritance example:
function Point2D( x, y)
{
this.x = x;
this.y = y;
}
function ColorPoint2D(x, y, c)
{
Point2D .call(this, x, y); //This is construction inheritance, calling the constructor of the parent class
//From the previous example, this is equivalent to
//this.base=Point2D ;
//this.base.call(this,x,y);
this.color = c;
}
ColorPoint2D.prototype = new Point2D(); //Prototype is used here Inherit and let ColorPoint2D take the Point2D object as the prototype

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go 言語は、クロージャとリフレクションという 2 つの動的関数作成テクノロジを提供します。クロージャを使用すると、クロージャ スコープ内の変数にアクセスでき、リフレクションでは FuncOf 関数を使用して新しい関数を作成できます。これらのテクノロジーは、HTTP ルーターのカスタマイズ、高度にカスタマイズ可能なシステムの実装、プラグイン可能なコンポーネントの構築に役立ちます。

C++ 関数の名前付けでは、読みやすさを向上させ、エラーを減らし、リファクタリングを容易にするために、パラメーターの順序を考慮することが重要です。一般的なパラメータの順序規則には、アクション-オブジェクト、オブジェクト-アクション、意味論的な意味、および標準ライブラリへの準拠が含まれます。最適な順序は、関数の目的、パラメーターの種類、潜在的な混乱、および言語規約によって異なります。

1. SUM 関数は、列またはセルのグループ内の数値を合計するために使用されます (例: =SUM(A1:J10))。 2. AVERAGE 関数は、列またはセルのグループ内の数値の平均を計算するために使用されます (例: =AVERAGE(A1:A10))。 3. COUNT 関数。列またはセルのグループ内の数値またはテキストの数をカウントするために使用されます。例: =COUNT(A1:A10)。 4. IF 関数。指定された条件に基づいて論理的な判断を行い、結果を返すために使用されます。対応する結果。

C++ 関数のデフォルト パラメーターの利点には、呼び出しの簡素化、可読性の向上、エラーの回避などがあります。欠点は、柔軟性が限られていることと、名前の制限があることです。可変引数パラメーターの利点には、無制限の柔軟性と動的バインディングが含まれます。欠点としては、複雑さの増大、暗黙的な型変換、デバッグの難しさなどが挙げられます。

このWebサイトは7月9日、AMD Zen5アーキテクチャの「Strix」シリーズプロセッサには2つのパッケージングソリューションがあり、小型のStrixPointはFP8パッケージを使用し、StrixHaloはFP11パッケージを使用すると報じた。出典: videocardz 出典 @Olrak29_ 最新の事実は、StrixHalo の FP11 パッケージ サイズが 37.5mm*45mm (1687 平方ミリメートル) であり、これは Intel の AlderLake および RaptorLake CPU の LGA-1700 パッケージ サイズと同じであるということです。 AMD の最新の Phoenix APU は、サイズ 25*40mm の FP8 パッケージング ソリューションを使用しています。これは、StrixHalo の F

C++ で参照型を返す関数の利点は次のとおりです。 パフォーマンスの向上: 参照による受け渡しによりオブジェクトのコピーが回避され、メモリと時間が節約されます。直接変更: 呼び出し元は、返された参照オブジェクトを再割り当てせずに直接変更できます。コードの簡素化: 参照渡しによりコードが簡素化され、追加の代入操作は必要ありません。

効率的で保守しやすい Java 関数を作成するための鍵は、シンプルに保つことです。意味のある名前を付けてください。特殊な状況に対処します。適切な可視性を使用してください。

C++ の例外処理は、特定のエラー メッセージ、コンテキスト情報を提供し、エラーの種類に基づいてカスタム アクションを実行するカスタム例外クラスを通じて強化できます。 std::Exception から継承した例外クラスを定義して、特定のエラー情報を提供します。カスタム例外をスローするには、throw キーワードを使用します。 try-catch ブロックでdynamic_castを使用して、キャッチされた例外をカスタム例外タイプに変換します。実際の場合、open_file 関数は FileNotFoundException 例外をスローします。例外をキャッチして処理すると、より具体的なエラー メッセージが表示されます。
