javascriptではどのようにオブジェクトを作成しますか?


jsでは対象が対象であり、関数も対象であり、javaプログラマにとっては非常に困惑しやすい.そして一体何がクラスですか?jsも明確なルールがないようです.プロトタイプをインターフェースとして認識していますが、実際にはjsの場合、オブジェクトを作成する必要はありません.新しいタイプを作成する必要はありません.
これは、jsにオブジェクトを作成するという奇妙な行動をもたらし、最も簡単な構造である.

var oObj = new Object();
oObj.attr_1 = "string value";
oObj.attr_2 = 4;
oObj.attr_3 = function() {alert("");}
しかし、このように一つの問題が発生し、同じタイプに対しては一つの対象しか生まれません.対象向けのプログラミングの中で、これは面白いことです.定義されたタイプのために複数のオブジェクトを同時に生成する方法を考えなければなりません.

function createObj() {
  var oObj = new Object();
  oObj.attr_1 = "string value";
  oObj.attr_2 = 4;
  oObj.attr_3 = function() {alert(this.attr_1);}

  return oObj;
}

var oObj1 = createObj();
var oObj2 = createObj();
奇妙に見えますが、これはjsの中のいわゆる「構造関数」です.このようにして、同じ属性と方法を持つ複数のオブジェクトを生成することができる.
ここでは、この関数はオブジェクトではなく大域関数として使用されます.jsのプログラミングをする時、私達はずっと心の中で数えなければならなくて、私の創建したすべての関数あるいは方法、私はそれを何として使うつもりで、関数ですか?それとも対象ですか?これでは迷いません.
上のコードは美しく見えますが、実は問題が多いです.まず、各属性値は固定されています.異なるオブジェクトに対しては、異なる属性を与えることができます.だから、構造関数を変更します.

function createObj(sAttr1, nAttr2) {
  var oObj = new Object();
  oObj.attr_1 = sAttr1;
  oObj.attr_2 = nAttr2;
  oObj.attr_3 = function() {alert(this.attr_1);}

  return oObj;
}

var oObj1 = createObj("string1", 4);
var oObj2 = createObj("string2", 5);
もう一つの問題は、毎回私がcallを使ってcreateObjをする時に、新しい方法atrを使うということです.3作成されます私達は知っていますが、伝統的なオブジェクト指向のデザインでは、方法は再利用できます.すべての対象は自分を作成する方法ではなく、方法の山にある種類の記録を指します.
jsの中で、私達はどうやってこの状況をシミュレートしますか?下のコードを見てください.

function fAttr() {alert(this.attr_1);

function createObj(sAttr1, nAttr2) {
  var oObj = new Object();
  oObj.attr_1 = sAttr1;
  oObj.attr_2 = nAttr2;
  oObj.attr_3 = fAttr;

  return oObj;
}

var oObj1 = createObj("string1", 4);
var oObj2 = createObj("string2", 5);
このようにして、属性は予め作成した関数だけを指しています.毎回再作成することはありません.
しかし、このように見えるのはおかしいです.まず、関数fAttrは構造関数と一体にならないようです.
この時はプロトタイプが役に立ちます.

function createObj() {

}

createObj.prototype.attr_1 = 4;
createObj.prototype.attr_2 = "string1";
createObj.prototype.attr_3 = function() {alert(this.attr_1);

var oObj1 = new createObj();
var oObj2 = new createObj();
このコードはすべてのデータが原型の中に一つあることを保証しています.新しい作成の対象ごとに、自然に一つがあります.ここでは、関数ではなくcreateObj()が対象とされるべきだということを覚えておきます.
java coding styleによってコードを仕様に変えます.

function Obj() {

}

Obj.prototype.attr_1 = 4;
Obj.prototype.attr_2 = "string1";
Obj.prototype.attr_3 = function() {alert(this.attr_1);

var oObj1 = new Obj();
var oObj2 = new Obj();
どうですか?しかし問題はまた来て、私達はまた古い道に帰って、すべての対象の属性の値はまた固定になりました.
私たちは先ほど使った二つの方法を結合します.

function Obj(a1,a2) {
  this.attr_1 = a1;
  this.attr_2 = a2;
}

Obj.prototype.attr_3 = function() {alert(this.attr_1);

var oObj1 = new Obj(5, "String1");
var oObj2 = new Obj(6, "String2");
このように属性と方法を分けて定義して、さらに対象に向かう感じがあります.
しかし、极端な完璧主义者はやはり満足できないと思います.このようなタイプの定义はjavaの中のクラスの定义がそんなにはっきりしていないので、完璧にカプセル化されています.そこで、javaの変態狂のために設計する方法が誕生しました.

function Obj(a1,a2) {
  this.attr_1 = a1;
  this.attr_2 = a2;

  if(typeof Obj._inited == "undefined") {
    Obj.prototype.attr_3 = function() {alert(this.attr_1);

    Obj._inited = true;
  }
}

var oObj1 = new Obj(5, "String1");
var oObj2 = new Obj(6, "String2");
javascript高級プログラムの設計に感謝します.