検索
ホームページウェブフロントエンドjsチュートリアルJavaScript のオブジェクト指向のアプローチは、コンストラクター (Constructor) を使用せずに実装できます。 新しいキーワード_JavaScript のヒント

JavaScript のオブジェクト モデルはあまり知られていません。かつて彼らについてブログを書いたことがあります。あまり知られていない理由の 1 つは、広く使用されている言語の中でプロトタイプによる継承を実装しているのが JavaScript だけであることです。しかし、もう一つの理由は、このオブジェクトモデルが非常に複雑で説明が難しいことだと思います。なぜこれほど複雑でわかりにくいのでしょうか?それは、JavaScript が従来のオブジェクト指向の特性を隠そうとするためであり、最終的にはその二重人格につながります (訳者注: 著者は、JavaScript にはプロセス指向とオブジェクト指向の両方の特性があると言っています)。

JavaScript オブジェクト モデルを理解して使用するのが難しいからこそ、CoffeeScript、Dart、TypeScript のようなコンパイルによって JS コードを生成できる言語があるのだと思います。

JavaScript の先駆者や熱心な人々は、JavaScript にはよ​​り優れたオブジェクト モデルがあると信じており、JavaScript が誰からも忘れ去られることを嘆いています。 JavaScript の専門家である Nicholas Zakas も、ECMAScript 6 で追加された新しいクラス構文を歓迎しています。これは、プロトタイプのスタイル構文を変更したものにすぎません。言い換えれば、従来の OOP が勝つということです。

大胆なアイデア
しかし、冗談めいたアイデアを考えてみましょう。従来のオブジェクト指向プログラミングがそれほど優れていなかった過去に旅行することを想像してください。それどころか、プロトタイプベースの継承モデルは誰にでも広く受け入れられています。何が起こるでしょうか?最終的にはどのようなデザインパターンになるのでしょうか?

もう一度想像してみましょう: JavaScript にコンストラクターや new キーワードがなかったらどうなるでしょうか?次に何が起こるでしょうか?過去に遡ってみましょう。 :)

まず第一に、JavaScript ではオブジェクト リテラルを使用して新しいオブジェクトを作成できます。以下に示すように:

コードをコピーします コードは次のとおりです:

var felix = {
name : 'Felix',
greet: function(){
console.log('こんにちは、' this.name '.');
}; >

次に、同じgreetメソッドを共有する複数のオブジェクトを作成できるように、greet関数を一般化して抽出し、一般的な場所に置きたいとします。これを達成するにはどうすればよいでしょうか?
いくつかのオプションがあります。まずは mixin から始めましょう。


1. Mixin(Augmentation)
JavaScript 言語では、属性の混合は非常に簡単です。混合したオブジェクトのプロパティを、混合したいオブジェクトにコピーするだけです。これを実装するには「augment」関数を使用します。コードを見ると理解できます:

var Dude = {
greet: function(){
console.log('こんにちは、' this.name '.')
}
};
var felix = { name: 'Felix' };
augment(felix, Dude);//Dude の属性を felix にコピーします、つまり mixin


上記のコードでは、augment 関数が Dude オブジェクトのプロパティを felix に混合します。多くの JS ライブラリでは、拡張関数は extend と呼ばれます。一部の言語では継承を表現するために extend を使用しており、混乱するため、extend を使用するのは好きではありません。私はそれを表現するために「augment」を使用することを好みます。実際、このアプローチは継承ではなく、構文 augment(felix, Dude) は、継承ではなく Dude の属性を使用して felix を拡張していることをすでに明確に示しているからです。

おそらく、拡張コードが実装されていることはすでに推測されていると思いますが、はい、非常に簡単です。以下に示すように:


function augment(obj,プロパティ){
for (プロパティの var key){
obj[key] = property[key];
}
}


2.クローン作成 )
mixin の代替方法は、最初に Dude オブジェクトのクローンを作成し、次にクローン化されたオブジェクトに name 属性を設定することです。以下に示すように:

var Dude = {
greet : function(){
console.log('こんにちは、' this.name '.');
}
}
var felix = clone(Dude);// Dude オブジェクト
felix.name = 'Felix'

をクローンします。
2 つのメソッドの唯一の違いは、プロパティが追加される順序です。クローン化されたオブジェクト内の特定のメソッドをオーバーライドする場合は、この手法の使用を検討してください。
コードをコピーします コードは次のとおりです。

var felix = clone(Dude); 🎜>felix .name = 'Felix';
felix.greet = function(){
console.log('Yo dawg!')
};//greet メソッドをオーバーライドします

親クラスのメソッドを呼び出す場合も非常に簡単です - 以下に示すように apply 関数を使用します

コードをコピーします コードは次のとおりです。
felix.greet = function(){
Dude.greet.apply(this);
this.greetingCount ; 🎜>}


これは、コンストラクターの .prototype プロパティを使用する必要がないため、プロトタイプ スタイルのコードよりもはるかに優れています。コンストラクターは使用しません。
以下はクローン関数の実装です:


コードをコピーします コードは次のとおりです:
function clone (obj){
var retval = {};//空のオブジェクトを作成します
augment(retval, obj);// 属性をコピーします
return retval
}


3. 継承
最後に継承です。私の意見では継承は過大評価されていますが、「インスタンス オブジェクト」間でプロパティを共有するという点で、継承にはオブジェクトの拡張よりもいくつかの利点があります。オブジェクトをパラメータとして受け取り、そのオブジェクトを継承する新しいオブジェクトを返す継承関数を作成しましょう。

継承を使用すると、同じオブジェクトから継承する複数の子オブジェクトを作成でき、これらの子オブジェクトは親オブジェクトのプロパティをリアルタイムで継承できます。以下のコードに示すように、



コードをコピー

コードは次のとおりです。 var garfield = assign( Dude);//garfield は Dude から継承します Dude.walk = function(){//Dude walk に新しいメソッドを追加します console.log('Step, step'); ; garfield.walk(); // 「ステップ、ステップ」を出力します
felix.walk(); // 「ステップ、ステップ」も出力します


プロトタイプベースが使用されます継承関数内 オブジェクトの継承




コードをコピー


コードは次のとおりです。 //非標準属性 __proto__ を使用します
var ret = {};
return ret;
//どちらでもない場合サポートされている場合は、コンストラクターを使用します。 Inherit
var f = function(){};
return new f();

上記 コードの見栄えがよくありません。これは、機能モニタリングを使用して 3 つのメソッドのどれを使用するかを決定しているためです。

では、コンストラクター メソッド (つまり、初期化メソッド) をどのように使用するのでしょうか?インスタンス オブジェクト間で初期化コードを共有するにはどうすればよいですか?場合によっては、オブジェクトの一部のプロパティを設定するだけでよい場合は、上記の例のように初期化関数は必要ありません。ただし、さらに多くの初期化コードがある場合は、たとえば、initialize という初期化メソッドを使用するなどの規則を作成することもできます。次のように、initialize というメソッドが Dude で定義されていると仮定します:




コードをコピーします


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

var Dude = {
初期化: function(){
this.greetingCount = 0;
},
greet: function(){ console.log( 'こんにちは、' this.name ' です。'); this.greetingCount ; } }
次に、このようにオブジェクトを初期化できます




コードをコピーします


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

var felix = clone(Dude);
felix.name = 'Felix';
var felix = { name: 'Felix' }
felix.name = 'Felix';
augment(felix, Dude);
var felix = assign(Dude); ';
felix.initialize();結論


つまり、上で定義した 3 つの関数 (augment、clone、inherit) を通じて、JavaScript でオブジェクトを使って何でもできるということです。コンストラクターと new キーワードを使用する必要はありません。これら 3 つの関数によって具体化されるセマンティクスは、より単純で、JavaScript の基礎となるオブジェクト システムに近いと思います。 (終わり)^_^
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

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ヘンタイを無料で生成します。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 英語版

SublimeText3 英語版

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

SublimeText3 Mac版

SublimeText3 Mac版

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