関数 - javascript コンストラクタ




オブジェクトリテラルまたはコンストラクタ関数を使用する必要がありますか? (6)

//オブジェクトリテラルとオブジェクトコンストラクタ

function MyData(foo, bar) {
        this.foo = foo;
        this.bar = bar;

    }
MyData.prototype.verify = function () {
        return this.foo === this.bar;
    };

//add property using prototype

var MD  = new MyData;//true.
var MD = new MyData();//true.
MD.verify// return only the function structure.
MD.verify(); //return the verify value and in this case return true coz both value is null. 
var MD1  = new MyData(1,2); // intialized the value at the starting. 
MD1.verify// return only the function structure.
MD1.verify(); // return false coz both value are not same.
MD1.verify(3,3);// return false coz this will not check this value intialized at the top 
MyData.prototype.verify = function (foo,bar) {
    return this.foo === this.bar;
};
var MD1  = new MyData(1,2);
MD1.verify();
MD1.verify(3,3);// return false coz this keyword used with foo and bar that will check parent data 

私はどのような方法で私はjavascriptでオブジェクトを作成する必要があります混乱してきています。 少なくとも2つの方法があるようです。 1つはオブジェクトリテラル表記を使用し、もう1つは構築関数を使用することです。 1つの利点は他のものよりも優れていますか?


ページのオブジェクトの単一のインスタンス - リテラルが必要ですか?

DTOオブジェクトのようなデータを簡単に転送したいですか?GET SET: - リテラル

メソッドビヘイビア、複数インスタンス - コンストラクタ関数、OOP原則に従う、継承 - を持つ実オブジェクトを作成しますか?

以下は、リテラルとは何か、コンストラクタ関数とはどのように違うのかを詳しく説明するYouTubeのビデオです。

https://www.youtube.com/watch?v=dVoAq2D3n44


それはあなたがしたいことにかかっています。 オブジェクト内で(半)プライベート変数または関数を使用する場合は、コンストラクタ関数を使用します。 オブジェクトにプロパティとメソッドのみが含まれている場合、オブジェクトリテラルは問題ありません。

function SomeConstructor(){
    var x = 5;
    this.multiply5 = function(i){
        return x*i;
    }
}
var myObj = new SomeConstructor;

var SomeLiteral = {
    multiply5: function(i){ return i*5; }
}

myObjSomeLiteralはまったく同じことを行います。 唯一の違いは、myObjがプライベート変数を使用することです。 後者は場合によっては有用かもしれない。 ほとんどの場合、Objectリテラルで十分であり、JSオブジェクトを作成するためのきれいでクリーンな方法です。


オブジェクトリテラルを使用すると、初期値の導入により、より合理的になり、よりよく拡張されます。


以下のコードは、オブジェクト、オブジェクトリテラル構文、関数コンストラクター、およびObject.create() 3つの作成方法を示しています。 オブジェクトのリテラル構文は、 __prototype__作成し、その__prototype__でオブジェクト化するので、その__prototype__Objectオブジェクトであり、 Objectすべてのプロパティとメソッドにアクセスできます。 厳密には、デザインパターンの観点から、単純なObjectリテラルを使用してデータの単一のインスタンスを格納する必要があります。

関数コンストラクターには、 .prototypeという特別なプロパティーが.prototypeます。 このプロパティは、関数コンストラクタによって作成されたオブジェクトの__prototype__になります。 関数コンストラクターの.prototypeプロパティーに追加されたすべてのプロパティーとメソッドは、それが作成するすべてのオブジェクトで使用可能になります。 データの複数のインスタンスが必要な場合や、オブジェクトからの動作が必要な場合は、コンストラクタを使用する必要があります。 関数コンストラクタは、プライベート/パブリックの開発パターンをシミュレートする場合にも最適です。 すべての共有メソッドを.prototype入れて、各オブジェクトインスタンスで作成されないようにして.prototype

Object.create()オブジェクトを作成すると、このメソッドで作成されたオブジェクトの__prototype__としてオブジェクトリテラルが使用されます。 オブジェクトリテラルに追加されたすべてのプロパティとメソッドは、実際のプロトタイプ継承によって作成されたすべてのオブジェクトで使用できます。 これが私の好ましい方法です。

//Object Example

//Simple Object Literal
var mySimpleObj = {
    prop1 : "value",
    prop2 : "value"
}

// Function Constructor
function PersonObjConstr()  {
    var privateProp = "this is private";
    this.firstname = "John";
    this.lastname = "Doe";
}
PersonObjConstr.prototype.greetFullName = function()    {
    return "PersonObjConstr says: Hello " + this.firstname + 
    " " + this.lastname;
};

// Object Literal
var personObjLit = {
    firstname : "John",
    lastname: "Doe",
    greetFullName : function() {
        return "personObjLit says: Hello " + this.firstname +
        ", " + this.lastname;
    }
} 

var newVar = mySimpleObj.prop1;
var newName = new PersonObjConstr();
var newName2 = Object.create(personObjLit);

基本的には、オブジェクトの複数のインスタンスを必要とするかどうかを判断する必要があります。 コンストラクタで定義されたオブジェクトは、そのオブジェクトの複数のインスタンスを持つことができます。 オブジェクトリテラルは、基本的にすべてがパブリックな変数/メソッドを持つシングルトンです。

// define the objects:
var objLit = {
  x: 0,
  y: 0,
  z: 0,
  add: function () {
    return this.x + this.y + this.z;
  }
};

var ObjCon = function(_x, _y, _z) {
  var x = _x; // private
  var y = _y; // private
  this.z = _z; // public
  this.add = function () {
    return x + y + this.z; // note x, y doesn't need this.
  };
};

// use the objects:
objLit.x = 3; 
objLit.y = 2; 
objLit.z = 1; 
console.log(objLit.add());    

var objConIntance = new ObjCon(5,4,3); // instantiate an objCon
console.log(objConIntance.add());
console.log((new ObjCon(7,8,9)).add()); // another instance of objCon
console.log(objConIntance.add()); // same result, not affected by previous line




javascript