ホームページ > ウェブフロントエンド > jsチュートリアル > プロトタイプとクロージャ: JavaScript オブジェクトの作成方法はどれが適していますか?

プロトタイプとクロージャ: JavaScript オブジェクトの作成方法はどれが適していますか?

DDD
リリース: 2024-12-11 04:37:09
オリジナル
693 人が閲覧しました

Prototype vs. Closure: Which JavaScript Object Creation Method is Right for You?

カスタム JavaScript オブジェクトの適切な実装

JavaScript では、プロパティとメソッドを使用してカスタム オブジェクトを作成するための 2 つの異なるアプローチ、つまりプロトタイプの方法とクロージャの方法を提供します。

プロトタイプ方法

このメソッドは JavaScript によりネイティブであり、プロトタイプ検索プロパティを利用します。

function Shape(x, y) {
  this.x = x;
  this.y = y;
}

Shape.prototype.toString = function() {
  return 'Shape at ' + this.x + ', ' + this.y;
};

function Circle(x, y, r) {
  Shape.call(this, x, y); // Invoke base constructor
  this.r = r;
}
Circle.prototype = new Shape(); // Set subclass prototype

Circle.prototype.toString = function() {
  return 'Circular ' + Shape.prototype.toString.call(this) + ' with radius ' + this.r;
};
ログイン後にコピー

クロージャーの方法

このメソッドは、プロトタイプの継承を完全に回避し、インスタンスごとに新しいクロージャーを作成します。

function Shape(x, y) {
  var that = this;
  this.x = x;
  this.y = y;
  this.toString = function() {
    return 'Shape at ' + that.x + ', ' + that.y;
  };
}

function Circle(x, y, r) {
  var that = this;
  Shape.call(this, x, y); // Invoke base constructor
  this.r = r;
  var _baseToString = this.toString;
  this.toString = function() {
    return 'Circular ' + _baseToString.call(that) + ' with radius ' + this.r;
  };
}

var myCircle = Circle(); // Using `new` is optional here
ログイン後にコピー

選択と考慮事項

どちらの方法にも利点があり、

プロトタイプの方法

  • 重いオブジェクトの継承をより効率的に行う
  • JavaScript にネイティブで、instanceof の使用を容易にする
  • 適切なコンストラクターの呼び出しが必要ですサブクラス

クロージャ方法

  • すべてのインスタンスにはメソッドの独自のコピーがあります (効率は低くなります)
  • へのメソッドのバインドを簡素化しますインスタンス
  • instanceof はサポートされていないため、カスタムが必要ですchecks

最終的に、最良の選択は、特定のプロジェクトの要件と好みによって異なります。

以上がプロトタイプとクロージャ: JavaScript オブジェクトの作成方法はどれが適していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート