Кто-то мог дать мне пример Утки, Вводящей наследование в JavaScript? Я исследую OO JavaScript, и я услышал об утином вводе, но не вижу примеров его используемый в JavaScript.
Вторая ссылка дает пример шаблона js, похожего на утиную печать. Не говорю, что рекомендую это сделать, но ... ну, вы просили об этом. ;)
В компьютерном программировании с объектно-ориентированные языки программирования, утиная печать - это стиль динамического печатая, в котором текущий объект набор методов и свойств определяет допустимую семантику, скорее чем его наследство от определенного класс или реализация определенного интерфейс.
Самый простой подход - определить заключить договор неформально и просто положиться на разработчики по обе стороны интерфейс, чтобы знать, что они делают. Дэйв Томас дал такой подход название "утка, печатающая" - если она ходит как утка и крякает как утка, тогда это утка. Аналогично с нашими
Форма
интерфейса, если он может вычислить площадь и периметр, то этоФорма
.
Правило "Duck Typing" гласит:
Если он выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это и есть утка.
В объектно-ориентированном языке программирования, основанном на классах (например, C++), чтобы оба объекта выглядели как утка, вы должны наследовать их классы от общего "интерфейсного" класса, так что компилятор позволит вам вызывать утиные
методы на них. Это называется сильной типизацией.
Вот как это сделано в Javascript:
var duck = {
appearance: "feathers",
quack: function duck_quack(what) {
print(what + " quack-quack!");
},
color: "black"
};
var someAnimal = {
appearance: "feathers",
quack: function animal_quack(what) {
print(what + " whoof-whoof!");
},
eyes: "yellow"
};
function check(who) {
if ((who.appearance == "feathers") && (typeof who.quack == "function")) {
who.quack("I look like a duck!\n");
return true;
}
return false;
}
check(duck); // true
check(someAnimal); // true
Видите, функция check
проверяет, похож ли переданный объект на утку (проверяется внешний вид и способность крякать). Мы передадим ей два разных объекта, и она вернет true
для обоих. Помимо внешнего вида и кряканья это могут быть совершенно разные вещи, но в данной конкретной функции check
они ведут себя одинаково (имеют общий интерфейс), они оба выглядят как "утка". Мы можем вызвать метод quack
на обоих объектах (и кому какое дело, что они на самом деле из себя представляют).