7

JavaScriptオブジェクトには、継承を容易にするための「プロトタイプ」メンバーがあります。しかし、それがなくても完全にうまく生きることができるようで、それを使用することの利点は何であるかと思いました。私は賛否両論は何であるか疑問に思いました。

たとえば、次のことを考慮してください(ここではjsfiddle)。

function Base (name) {

    this.name = name;
    this.modules = [];
    return this;
}

Base.prototype =
{
    initModule: function() {
        // init on all the modules.
        for (var i = 0; i < this.modules.length; i++)
            this.modules[i].initModule();
        console.log("base initModule");
    }   
};

function Derived(name) {
       Base.call(this,name); // call base constructor with Derived context
}

Derived.prototype = Object.create(Base.prototype);

Derived.prototype.initModule = function () {
      console.log("d init module");
      //  calling base class functionality
      Base.prototype.initModule.call(this);
    }

var derived = new Derived("dname");
console.log(derived.name);
derived.initModule();

問題は、なぜ「プロトタイプ」を使用するのかということです。私たちはまた、次のようなことをすることができますDerived = Object.create(Base);

例(jsfiddle):

Base =
{
    initModule: function() {
        // init on all the modules.
        for (var i = 0; i < this.modules.length; i++)
            this.modules[i].initModule();
        console.log("base initModule",this.name);
    },
    init: function(name) {
        this.name = name; 
        this.modules = [];
    }
};

Derived = Object.create(Base);

Derived.initModule = function () {
      console.log("d init module");
      //  calling base class functionality
      Base.initModule.call(this);
    }
Derived.init("dname");
console.log(Derived.name);
Derived.initModule();
4

3 に答える 3

3

プロトタイプを使用しない場合、メソッドはすべてのクラスで再定義されます。つまり、2番目の例では6つの関数new Base; new Base; new Baseを作成します。これには、より多くの時間とスペースがかかります。 また、独自の関数を作成します。Derived

さらに、プロトタイプを使用して各インスタンスのメソッドをオンザフライで変更(または新しいメソッドを追加)することはできません。これは、特にモジュール間で役立つ可能性があります。

ただし、すべてのメソッドで常にプロトタイプを使用する必要があるとは限りません。それぞれの状況は異なります。

prototypeまた、インスタンスを作成せずに別のコンテキストでメソッドを呼び出すこともできます(Array.prototype.forEach.call配列のようなオブジェクトの場合のように)。

于 2013-03-07T16:20:37.720 に答える
1

基本的には非常に単純です。Object.createはEcmascript5の一部であり、非常に新しいものです。プロトタイプはjavascriptの開始以来存在しており、すべてのブラウザでサポートされています。

Internet Explorer 7または8のサポートが必要な限り、Createに依存するべきではありません。https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/createも参照してください

(この記事では、プロトタイプを使用するポリフィルも提案されています;-))

于 2013-03-07T16:19:10.190 に答える
-2

OOのプロトタイプ(IMHOは短所です)は必要ありません。

継承についてこれを考慮してください:

function SubClass()
{
    var object = {};
    object.publicVar = 2;
    object.publicMethod = function SubClassPubMeth()
      {
        return this.publicVar + 2;
      };
    object.poly = function SubClassPoly()
      {
        return 'SubClassPoly';
      };
    return object;
}

function Class()
{
    var object = new SubClass();
    object.classPublicVar = 3;
    object.classPublicMethod =
        function ClassMethod()
        {
            return this.publicVar + this.classPublicVar;
        };
    object.poly = function ClassPoly()
      {
        return 'ClassPoly';
      };
    return object;
}

相続の法案に合うようです。

情報を隠すためにもこれを考慮してください:

function Class(){var object = {}; object.x = 3; var privateVar = 3; function privateFunction(object){return object.x + privateVar; }

object.publicFunction = function()
  {
    var priv = privateFunction(this);
    priv += privateVar;
    privateVar = privateVar + 3;
    return priv;
  };
return object;

}

また、情報隠蔽(別名カプセル化)のトリックを行うようです

もっと言う必要があります。

于 2013-03-07T16:20:11.463 に答える