2016-06-01 3 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. Я отслеживал ошибку и получается, когда 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(); 

Но, вы можете просто позвонить return this.bar() и прототип обход будет выполнен автоматически Javascript, пока метод не будет найден в цепочке прототипов.

+0

Я только понимаю, что это глупый вопрос, но все же спасибо за ответ! – user3928256

+1

и, что еще важнее, с помощью 'this.bar()' scope в 'bar()' будет установлен в текущий экземпляр вместо объекта-прототипа. Это может быть важно при доступе к свойствам 'this', и даже более важно, когда вы их модифицируете. – Thomas

+0

@ Томас, хорошо сказано! Я забыл упомянуть об этом. – Dimos

1

Невозможно получить доступ к bar на прототипе. Просто обратитесь к нему на экземпляр:

return this.bar(); 
Смежные вопросы