2011-07-07 16 views
2

次のコードは、私が思ったようにプロトタイプを生成しません。誰でも私が間違っていることを見ることができますか?JavaScriptでこのプロトタイプに問題がありますか?

var A = function() { 
    return { 
     workingTest: function() {return "OK";} 
    }; 
}; 

A.prototype.notWorkingTest = function() {return "Not so much";}; 

var a = new A(); 

a.workingTest(); // "OK" 
a.notWorkingTest(); // TypeError: "undefined_method" 

私はこれがJSクラスを拡張する正しい方法だと思っていましたが、何か不足しています。

+0

'console.log(a.prototype)'を実行するとどうなりますか? –

答えて

4

変更A

var A = function() { 
    this.workingTest = function() {return "OK";}; 
}; 

に問題があなたの元A機能を作成して返すObjectの直接のインスタンスを代わりにnewオペレータによって作成され、thisに結合させたAのインスタンスを使用していたということです。これを理解するには

、そう

var B = function() { return { x: 42 }; } 
var C = function() { this.x = 42; } 
var b = new B; 
var c = new C; 
alert("b.constructor === B : " + (b.constructor === B)); // false 
alert("b.constructor === Object : " + (b.constructor === Object)); // true 
alert("c.constructor === C : " + (c.constructor === C)); // true 

を実行してみてくださいBは、新しいオブジェクトを返すので、それが返す値はもはやinstanceof BあるとBのプロトタイプを使用していません。

+0

これで修正されました。あなたは、今日のヒーローです! –

0

Aは別のオブジェクトを返しますので、aAクラスのインスタンスではありません。むしろ、A関数によって返される普通のオブジェクトです。
Aまたはprototypeには接続されていません。

代わりに、あなたはまったく何も返すコンストラクタ内thisworkingTestを割り当てないようにする必要があります:new A()は 『匿名』のオブジェクトを返しながら、あなたはAのプロトタイプを拡張するので

var A = function() { 
    this.workingTest = function() { return "OK"; }; 
}; 
0

を。最新のブラウザで

0

、あなたとあなたの興味深いプロトタイピングのアプローチを維持することができます:

var A = { 
    workingTest: function() {return "OK";} 
}; 
A.notWorkingTest = function() {return "Yes it does";}; 

var a = Object.create (A); 
a.workingTest(); // "OK" 
a.notWorkingTest(); // "Yes it does" 

a.extending = function() {return "extended";}; 
var b = Object.create(a); 
b.workingTest(); // "OK" 
b.extending(); // "extended" 

これは、ES5仕様に応じて動作します。

0

オブジェクトリテラルを返す関数としてAを定義しました。関数を呼び出すときにキーワードnewを使用することは、それが特別な型の関数、つまりコンストラクタであることを意味します。 JavaScriptのコンストラクターは、特定の方法で記述し、キーワードを使用してプロパティを設定する必要があります。

var A = function() { 
    this.workingTest = function() {return "OK";}; 
}; 
関連する問題