有人能给我一个关于Javascript中Duck Typing继承的例子吗?我正在探索OO javascript,我听说过鸭子打字,但是看不到它在javascript中使用的任何例子。
答案 0 :(得分:122)
“Duck Typing”的规则是
如果它看起来像鸭子,像鸭子一样游泳,像鸭子一样嘎嘎叫,那么它可能是一只鸭子。
在基于类的面向对象编程语言(例如C ++)中,要使两个对象看起来像鸭子,你必须从一个通用的“接口”类继承它们的类,所以编译器会让你调用{{1他们的方法。这被称为强类型。
现在这是在Javascript中完成的:
duck
请参阅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
方法(以及谁在乎它们的真实含义)。
答案 1 :(得分:25)
第二个链接给出了js中类似鸭子的模式的示例。不是说我建议这样做,但是......好吧,你问过它。 ;)
用计算机编程 面向对象的编程语言, 鸭子打字是一种动态的风格 输入一个对象的当前值 一组方法和属性 确定有效的语义 而不是它从特定的继承 特定的类或实现 接口
最简单的方法是定义 非正式地合同,简单地依靠 每一侧的开发人员 界面知道他们在做什么。 戴夫托马斯已经采用了这种方法 “鸭子打字”的名字 - 如果它走了 像一只鸭子,它像鸭子一样嘎嘎叫 那它是一只鸭子。与我们相似
Shape
接口,如果它可以计算 区域和周长,然后它是一个Shape
。
答案 2 :(得分:4)
JavaScript中鸭子输入的示例是iterables。 JavaScript实际上没有名为Iterable
的类型,但它有一个对象的定义,可以迭代。
为了可迭代,对象必须实现@@ iterator方法
这是鸭子打字的要求。如果对象实现了在接口中定义的方法,则可以在接受接口类型的位置使用该对象。对于iterables,这是循环中的情况
for (let value of iterable) {
}
和数组
[...iterable]
答案 3 :(得分:-1)
在 Javascrript 中,Duck Typing 是动态的,用于定义模式和验证您的数据结构。此处,有效语义由对象的当前方法集决定,而不是由它们从特定类继承而来。