2012-02-03 14 views
1

このエラーが発生しています。オブジェクト#にはメソッド 'carName'がありません しかし、私ははっきりとしています。 Pastebinオブジェクト#<person>にはメソッド 'carName'がありません

私も

player.car.model 

で車の「モデル」プロパティを参照しようとしましたが、それは動作しません、私は型エラーを取得します。何か案は?もっと情報が必要ですか?

function person(name, car) { 
    this.name = name; 
    this.car = car; 
    function carName() { 
     return car.model; 
    } 
} 

var player = new person("Name", mustang); 
var bot = new person("Bot", mustang); 
var bot2 = new person("Bot 2", mustang); 

function makeCar(company, model, maxMPH, tireSize, zeroToSixty) { 
    this.company = company; 
    this.model = model; 
    this.maxMPH = maxMPH; 
    this.tireSize = tireSize; 
    this.zeroToSixty = zeroToSixty; 
} 

var mustang = new makeCar("Ford", "Mustang GT", 105, 22, 8); 
var nissan = new makeCar("Nissan", "Nissan 360z", 100, 19, 6); 
var toyota = new makeCar("Toyota", "Toyota brandname", 95, 21, 7); 
+0

質問を明確にしてください。今のところ、「仕事はしていません。修理してください。」 – akonsu

+1

@DoubleElite、いくつかの場所へのリンクを提供するのではなく、サンプルを質問に貼り付けてください(できるだけ小さくしてください)。 –

答えて

3

この方法はありません。それはコンストラクタの可変スコープに対してローカルな関数を持っています。

function person(name, car) { 
    this.name = name; 
    this.car = car; 
    this.carName = function() { 
     return this.car.model; 
    }; 
} 

以上、コンストラクタのprototype上に置き

それぞれが、機能オブジェクトプロパティとして割り当てる与えることを... ...また

function person(name, car) { 
    this.name = name; 
    this.car = car; 
} 

person.prototype.carName = function() { 
    return this.car.model; 
}; 

mustangpersonコンストラクタに渡すときに初期化されません。

+0

[こちらは動作例です](http://jsfiddle.net/sZuw7/)が役立ちます。 –

+0

ありがとう、1つの質問。なぜ "person"関数のプロトタイプコンストラクタを使うのが、関数にプロパティを代入するよりも優れているのでしょうか(最初のアプローチ)。彼らは同じことをしていませんか?人はプロトタイプのコンストラクタを継承するためです。 –

+0

@DoubleElite: 'person'コンストラクタからオブジェクトが継承するのは、プロトタイプオブジェクトのプロパティだけです。だから 'carName'を' person.prototype'に置くと、作成された 'person'オブジェクトはすべてその関数を共有します。コンストラクタ内で 'this.carName = func ...'を実行すると、各 'person'オブジェクトは一意の(しかし同一の)関数に割り当てられます。 'person'コンストラクタでは、' this'は構築されている*新しいオブジェクトへの直接参照です。私はあなたが他の言語でOOPに慣れているかもしれないと感じています。もしそうなら、JSはおそらく非常に異なっているでしょう。 –

関連する問題