2016-06-01 15 views
-1

JavaScriptで抽象ファクトリメソッドを使用するにはどうすればよいですか?たとえばJavaの場合:JavaScriptで抽象ファクトリメソッドを実装する方法は?

public abstract class SuperClass { 
    abstract String bar(); 

    public String foo() { 
     return bar(); 
    } 
} 

public class SubClass extends SuperClass{ 
    @Override 
    String bar() { 
     return "bar"; 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     System.out.println(new SubClass().foo()); 
    } 
} 

これはbarを示しています。しかし、JavaScriptでこれを試したときには、Uncaught TypeError: Cannot read property 'bar' of undefinedが得られます。私はバグを追跡し、SuperClass.prototype.fooが実行されているときにSubClass.prototypeはまだundefinedです。

これを行う正しい方法は何ですか?ありがとうございます!

答えて

1

あなたは__proto__フィールドを介してオブジェクトのプロトタイプにアクセスすることができます。 だから、あなたが変更した場合:

SuperClass.prototype.foo = function() { 
    return this.prototype.bar(); 
}; 

で:

SuperClass.prototype.foo = function() { 
    return this.__proto__.bar(); 

}; 

あなたの例では動作します。あなただけの​​を呼び出すことができますし、この方法は、プロトタイプチェーン内に発見されるまで、プロトタイプのトラバースは、Javascriptので自動的に実行され、

return Object.getPrototypeOf(this).bar(); 
return this.constructor.prototype.bar(); 

しかし: 使用することもできます。

+0

私はそれが愚かな質問だと気付いていますが、まだお返事いただきありがとうございます! – user3928256

+1

さらに重要なのは、 'this.bar()'を使うことによって 'bar()'のスコープがprototype-objectではなく現在のインスタンスに設定されることです。 'this'のプロパティにアクセスするときに重要であるかもしれませんし、それらを変更するときにさらに重要になります。 – Thomas

+0

@トーマス、よく言った!私はそれに言及するのを忘れていた。 – Dimos

1

プロトタイプのbarにアクセスしないでください。ただ、インスタンス上でアクセス:

return this.bar(); 
関連する問題