0

質問

こちら、作成しました

  • コンストラクターを使用するOwnerオブジェクト
  • コンストラクターを使用するCameraオブジェクト

2番目の出力ステートメントでは、最初のステートメントとして表示されることを期待していましたが、未定義と表示されます。

これはおそらく、、 などのsummary()ようにメソッドを書いた方法によるものです。this.ownerthis.make

注:-最初の出力ステートメントは、コンストラクターの外部から変数値にアクセスします。しかし、2 番目の出力ステートメントでは、summary()メソッドはコンストラクター自体の内部の変数にアクセスします。

make 変数 (引数ではない) をそのように使用するべきではありませんか? オブジェクトコンストラクター内でそれらを使用する方法は?

この概念を理解するのを手伝ってください。また、この概念を理解できる参考文献を提供してください。

テストの実行:コード スニペット @ CodeAcademy ワークスペース

コードスニペット

//camera object contructor
function Camera(model, make, year, owner)
{
    this.make = make.toString();
    this.model = model.toString();
    this.year = parseInt(year);
    this.owner = function(){
        return (owner.fname + " " + owner.lname).toString();
    }();
    this.summary = function(){
        return this.owner + " bought a " + this.make + " " + this.model + ", released in " + this.year + ".";
    }();
}

//owner object contructor
function Owner(fname, lname){
    this.fname = fname;
    this.lname = lname;
}

//create owner
var niky = new Owner("Niky", "Bauxi");
//create camera for owner
var niky_cam = new Camera("DSLR D3100", "Nikon", 2009, niky);

console.log(niky_cam.owner + " bought a " + niky_cam.make + " " + niky_cam.model + ", released in " + niky_cam.year + ".");
console.log(niky_cam.summary);

出力

Niky Bauxi bought a Nikon DSLR D3100, released in 2009.
undefined bought a undefined undefined, released in undefined.

解決

さまざまな回答とコメントを検討した後、

解決策 1: CodeAcademy ワークスペース

4

1 に答える 1

2

を呼び出しthis.ownerthis.makeおり、要約を作成するために使用している IIF などです。しかし、その IIF 内でthisは、window オブジェクトを参照します。構築している所有者オブジェクトではありません。window.ownerつまり、文字列でなどを使用しようとしていますwindow.makeが、それらは存在しません。

これを試して

function Camera(model, make, year, owner) {
    this.make = make.toString();
    this.model = model.toString();
    this.year = parseInt(year, 10); // ALWAYS supply a radix argument!
    this.owner = (function(){
        return (owner.fname + " " + owner.lname).toString();
    }());
    var that = this;
    this.summary = (function(){
        return that.owner + " bought a " + that.make + " " + that.model + ", released in " + that.year + ".";
    }());
}

しかし、IIF はどちらもそもそも無意味です。これを行うこともできます:

function Camera(model, make, year, owner) {
    this.make = make.toString();
    this.model = model.toString();
    this.year = parseInt(year, 10);
    this.owner = owner.fname + " " + owner.lname;
    this.summary = this.owner + " bought a " + this.make + " " + this.model + ", released in " + this.year + ".";
}

また、これらすべてを構造化するためのより良い方法があります (Benjamin Gruenbaum のコメントを参照)。


call補遺:またはを使用して IIF を別の方法で実行applyできるため、評価するコンテキストを渡すことができます

function Camera(model, make, year, owner) {
    // ...
    this.summary = (function(){
        return this.owner + " bought a " + this.make + " " + this.model + ", released in " + this.year + ".";
    }).call(this); // explicitly pass the current context to the function
}

しかし、繰り返しますが、あなたの場合、これはすべて不要です。

于 2013-03-02T23:18:54.600 に答える