Для сохранения пропускной способности здесь приведена ссылка на мой ответ на вопрос «Как я могу эмулировать« классы »в JavaScript? (Со сторонней библиотекой или без нее)» . Он содержит дополнительные ссылки, а также примеры.
Краткий ответ: сердце прототипа JavaScript OO - это делегирование. В этом стиле ООП разные объекты одного и того же «класса» могут делегировать обработку методов и свойств одному и тому же прототипу (обычно некоторому третьему объекту):
var foo = {
property: 42,
inc: function(){
++this.counter;
},
dec: function(){
--this.counter;
}
};
// Note: foo does not define `counter`.
Давайте создадим конструктор для объектов с foo в качестве прототипа. Фактически все необработанное будет передано в foo.
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
Аккуратно, а?