2016-06-01 74 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中嘗試這樣的:

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

var SubClass = function() {}; 
SubClass.prototype = Object.create(SuperClass.prototype); 
SubClass.prototype.constructor = SubClass; 

SubClass.prototype.bar = function() { 
    return "bar"; 
}; 

var myClass = new SubClass(); 
console.log(myClass.foo()); 

我得到Uncaught TypeError: Cannot read property 'bar' of undefined。我跟蹤了這​​個bug,結果發現,當SuperClass.prototype.foo正在執行時,SubClass.prototype仍然是undefined

那麼,什麼是正確的方法來做到這一點?謝謝!

回答

1

您可以通過__proto__字段訪問對象的原型。 所以,如果你改變:

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

有:

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

}; 

您的示例工作。 您還可以使用:

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

但是,你可以調用​​和原型遍歷會自動的Javascript,直到方法是在原型鏈中被執行。

+0

我剛剛意識到這是一個愚蠢的問題,但仍然感謝您的回答! – user3928256

+1

甚至更​​重要的是,通過使用'this.bar()''bar()'中的作用域將被設置爲當前實例而不是原型對象。當你訪問'this'的屬性時,這很重要,當你修改它們時更重要。 – Thomas

+0

@Thomas,說得好!我忘了提到這一點。 – Dimos

1

您不應在原型上訪問bar。只需訪問它:

return this.bar();