Основанная на прототипе объектная ориентация. Хороший, плохой, злой?

Я думаю, что код, который вы опубликовали, отсутствует. Размещенный вами код работает правильно, и я добился исключения только тогда, когда написал input.close () перед obj.getVotes (). Если вы хотите закрыть сканеры, вы должны сделать это после завершения кода. Таким образом, если вы закроете ввод после obj.getVotes (), вы не должны получить никакой ошибки.

10
задан Hoffmann 22 December 2008 в 02:36
поделиться

4 ответа

Основанное на прототипе OO предоставляет себя плохо статической проверке типа, которую некоторые могли бы рассмотреть плохой или ужасной вещью. Основанное на прототипе OO действительно имеет стандартный способ создать новые объекты, Вы клонируете и изменяете существующие объекты. Можно также создать фабрики и т.д.

Я думаю, какие люди как большинство ("польза") то, что основанное на прототипе OO очень легко и гибко, предлагая отношение очень высокой мощности к весу.

Для подсказок относительно того, как использовать основанное на прототипе OO, великолепное место для запуска является оригиналом Сам статья о Питании Простоты.

13
ответ дан 3 December 2019 в 17:22
поделиться

Для сохранения пропускной способности вот, ссылка на мой ответ на, "Как я могу эмулировать “классы” в JavaScript? (с или без сторонней библиотеки)". Это содержит дальнейшие ссылки, а также примеры.

Короткий ответ: основа prototypal OO JavaScript является делегацией. В этом стиле ООП различные объекты того же "класса" могут делегировать обработку методов и свойств к тому же прототипу (обычно некоторый третий объект):

var foo = {
    property: 42,
    inc: function(){
        ++this.counter;
    },
    dec: function(){
        --this.counter;
    }
};
// Note: foo does not define `counter`.

Давайте создадим конструктора для объектов с нечто как прототип. Эффективно, все необработанное будет делегировано к нечто.

var Bar = function(){
    this.counter = 0;
};
Bar.prototype = foo;  // This is how we set up the delegation.

// Some people refer to Bar (a constructor function) as "class".

var bar = new Bar();

console.log(bar.counter);  // 0 --- Comes from bar itself
console.log(bar.property); // 42 --- Not defined in bar, comes from foo

bar.inc();  // Not defined in bar => delegated to foo
bar.inc();
bar.dec();  // Not defined in bar => delegated to foo
// Note: foo.inc() and foo.dec() are called but this === bar
// that is why bar is modified, not foo.

console.log(bar.counter);  // 1 --- Comes from bar itself

Давайте определим inc() непосредственно на панели:

bar.inc = function(){
    this.counter = 42;
};

bar.inc();  // Defined in bar => calling it directly.
            // foo.inc() is not even called.
console.log(bar.counter);  // 42 --- Comes from bar

Установка цепочки единичного наследования:

var Baz = function(){
    this.counter = 99;
};
Baz.protype = new Bar();

var baz = new Baz();

console.log(baz.counter); // 99
baz.inc();
console.log(baz.counter); // 100

console.log(baz instanceof Baz);    // true
console.log(baz instanceof Bar);    // true
console.log(baz instanceof Object); // true

Аккуратный, а?

7
ответ дан 3 December 2019 в 17:22
поделиться

Прежде, чем вызвать беспокойство о том, как эмулировать основанное на классах наследование в JavaScript, имейте быстрое чтение Наследования Prototypal в JavaScript.

2
ответ дан 3 December 2019 в 17:22
поделиться

Хорошо, в первую очередь, опытная модель не все это отличающееся в действительности; Smalltalk использует подобный вид схемы; класс является объектом с методами классов.

Посмотревший на от класса POV, класс является действительно классом эквивалентности объектов с теми же данными, и весь одинаковый методы; можно посмотреть на добавление метода к прототипу как создание нового подкласса.

Реализация проста, но делает очень трудным сделать эффективный typechecking.

0
ответ дан 3 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: