4

私はここで記事を読んでいました:

http://javascriptweblog.wordpress.com/2010/03/16/five-ways-to-create-objects/

オブジェクトを作成する 5 つの方法について説明します。しかし、私の質問は彼の方法の1つです(3)は次のとおりです。

myApp.Notepad = function(defaultFont) {
    var  that = {};
    that.writeable = true;
    that.font = defaultFont;
    that.setFont = function(theFont) {
        that.font = theFont;
    }
    return that;
}

myApp.notepad1 =  myApp.Notepad('helvetica');

著者によると、複数のインスタンスが必要な場合に使用でき、3 (上記) から 5 までの任意のパターンを使用できます。

しかし、私の知る限り、this新しく作成されたインスタンスを反映し、そのインスタンスのみを参照するキーワードを使用する必要があります。ただし、上記の著者はthat代わりにオブジェクトを使用しており、上記で使用されているキーワードthisもありません。new複数のオブジェクトインスタンスにどのように適用されますか? を使用するのと本質的に同じthisですか?

4

2 に答える 2

4

あなたの例でthatは、この行によって作成された新しいオブジェクトです:

var that = {};

次に、関数はこのオブジェクトのプロパティの設定に進みます。

一方、thisはコンストラクター関数で使用されます。 using を呼び出すとnew、新しいオブジェクトが自動的に作成され、関数に として渡されthisます。同じ例は次のように記述できます。

myApp.Notepad = function(defaultFont) {
    this.writeable = true;
    this.font = defaultFont;
    this.setFont = function(theFont) {
        this.font = theFont;
    }
}

myApp.notepad1 = new myApp.Notepad('helvetica');
于 2012-02-21T05:45:57.370 に答える
2

まだ指摘されていないオブジェクト リテラル コンストラクター (コード) を使用する利点の 1 つは、オブジェクトの新しいインスタンスを作成するときにnewキーワードが必要ないことです。つまり、キーワードの使用を単に忘れた場合でも、コンストラクター関数で新しく作成されたオブジェクトにスコープを与えるためnewにキーワードの使用に依存しなくなるため、コードは意図したとおりに実行されます。オブジェクトがスコープを処理します。newthisthat

これは、YUI ライブラリ (および Douglas Crockford) がコンストラクタに対して採用しているアプローチです。

次の単純なコンストラクターを検討してください。

var Car = function(model){
  this.model = model;
};

Car('Dodge Viper');またはを呼び出すとvar MyCar = Car('Dodge Viper');this関数内の は実際にはグローバルwindowオブジェクトを参照します。したがって、上記のプロパティModelは実際にはグローバル変数ですが、これはおそらく意図したものではありません。

var Car = function(model) {
  var that = {};
  that.model = model;
  return that;
};

// Both work the same.
var MamsCar = new Car("Mini Cooper"); // with 'new'
var DadsCar = Car("Bugatti Veyron"); // without 'new'
alert("Mam's car is a " + MamsCar.model + " and dad's car is a " + DadsCar.model);

于 2013-05-07T11:48:02.427 に答える