鸭子在Javascript中打字

时间:2010-07-31 19:33:01

标签: javascript oop

有人能给我一个关于Javascript中Duck Typing继承的例子吗?我正在探索OO javascript,我听说过鸭子打字,但是看不到它在javascript中使用的任何例子。

4 个答案:

答案 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中类似鸭子的模式的示例。不是说我建议这样做,但是......好吧,你问过它。 ;)

  

用计算机编程   面向对象的编程语言,   鸭子打字是一种动态的风格   输入一个对象的当前值   一组方法和属性   确定有效的语义   而不是它从特定的继承   特定的类或实现   接口

Wikipedia - Duck typing

  

最简单的方法是定义   非正式地合同,简单地依靠   每一侧的开发人员   界面知道他们在做什么。   戴夫托马斯已经采用了这种方法   “鸭子打字”的名字 - 如果它走了   像一只鸭子,它像鸭子一样嘎嘎叫   那它是一只鸭子。与我们相似   Shape接口,如果它可以计算   区域和周长,然后它是一个   Shape

JavaScript Interfaces and Duck Typing

答案 2 :(得分:4)

JavaScript中鸭子输入的示例是iterables。 JavaScript实际上没有名为Iterable的类型,但它有一个对象的定义,可以迭代。

  

为了可迭代,对象必须实现@@ iterator方法

这是鸭子打字的要求。如果对象实现了在接口中定义的方法,则可以在接受接口类型的位置使用该对象。对于iterables,这是循环中的情况

for (let value of iterable) {
}

和数组

[...iterable]

答案 3 :(得分:-1)

在 Javascrript 中,Duck Typing 是动态的,用于定义模式和验证您的数据结构。此处,有效语义由对象的当前方法集决定,而不是由它们从特定类继承而来。