JavaScript Garden-構造関数


構造関数
JavaScriptの構造関数と他の言語の構造関数は違っています.通過する  new キーワード方式で呼び出された関数はすべて構造関数として考えられています.
コンストラクタの内部で-つまり呼び出された関数の中で-  this 新規作成のオブジェクトを指します.  Object.この新しく作成したオブジェクトの  プロトタイプ コンストラクタに向けられた  prototype呼び出された関数が明示的でない場合  return 表式を使うと、暗黙的に返されます.  this オブジェクト→新規作成の対象です.
function Foo() {
    this.bla = 1;
}

Foo.prototype.test = function() {
    console.log(this.bla);
};

var test = new Foo();
上のコードを  Foo コンストラクタとして呼び出し、新規作成対象の  prototype を選択します  Foo.prototype明示的  return 表式は戻りの結果に影響しますが、戻りの対象に限ります.
function Bar() {
    return 2;
}
new Bar(); //         

function Test() {
    this.value = 2;

    return {
        foo: 1
    };
}
new Test(); //      
訳者注:new Bar() は、新しく作成されたオブジェクトで、数字のワード値2ではありません.したがって  new Bar().constructor === Barですが、もし戻ってきたのがデジタルオブジェクトであれば、結果は違っています.
function Bar() {
    return new Number(2);
}
new Bar().constructor === Number
訳者注:ここで得た  new Test()は、newキーで新たに作成されたオブジェクトではなく、関数が返されるオブジェクトであるため、
(new Test()).value === undefined
(new Test()).foo === 1
もし  new 欠落した場合、関数は新しく作成したオブジェクトに戻りません.
function Foo() {
    this.bla = 1; //         
}
Foo(); // undefined
上の例では正常に動作する場合もありますが、JavaScriptでは  this 仕事の原理はここです.  this グローバルオブジェクトを指します.
工場モード
使わないために  new キーワード、コンストラクタは値を明示的に返さなければなりません.
function Bar() {
    var value = 1;
    return {
        method: function() {
            return value;
        }
    }
}
Bar.prototype = {
    foo: function() {}
};

new Bar();
Bar();
上の二つが正しいです  Bar 関数の呼び出しで返した値は全く同じで、新しく作成した所有者  method 属性のオブジェクトは戻りますが、ここでは包みを閉じるが作成されています.
注意が必要です  new Bar() 戻る対象の原型は変わりません.  Bar.prototype)コンストラクタのプロトタイプは作成したばかりの新しいオブジェクトに向けられます.ここのプロトタイプは  Bar この新しいオブジェクトを返しませんでした.  method 属性のカスタムオブジェクト)
上記の例では、使用または使用しない  new キーワードには機能性の違いがありません.
訳者注:上記2つの方式で作成されたオブジェクトはアクセスできません.  Bar プロトタイプチェーン上の属性は、以下のようになります.
var bar1 = new Bar();
typeof(bar1.method); // "function"
typeof(bar1.foo); // "undefined"

var bar2 = Bar();
typeof(bar2.method); // "function"
typeof(bar2.foo); // "undefined"
工場モードで新規オブジェクトを作成
私たちがよく耳にする忠告は使わないことです.  new キーワードを使って関数を呼び出します.これを忘れたらエラーが発生します.
新しいオブジェクトを作成するために、工場法を作成し、方法内で新しいオブジェクトを作成することができます.
function Foo() {
    var obj = {};
    obj.value = 'blub';

    var private = 2;
    obj.someMethod = function(value) {
        this.value = value;
    }

    obj.getPrivate = function() {
        return private;
    }
    return obj;
}
上記の方式は  new の呼び出し方式は間違えにくく、訳者注による便利さを十分に利用することができます.
新たに作成したオブジェクトは原型上の方法を共有できないので、メモリをもっと使うことができます.継承を実現するためには、工場法は、他のオブジェクトからすべての属性をコピーしたり、オブジェクトを新規作成の対象とするプロトタイプが必要です.原型チェーンを放棄するのは、漏れ防止だけです.  new 持ってきた問題は言語そのものの思想とは違うようです.締め括りをつける
漏れても  new キーワードは問題になるかもしれませんが、プロトタイプチェーンの使用を放棄する口実ではありません.最終的にどのような方法を使うかは、アプリケーションのニーズに応じて、コードを選んでスタイルを書き続けていくことが一番重要です.