【问题标题】:Duck Typing in JavascriptJavascript 中的鸭子打字
【发布时间】:2011-03-23 17:06:46
【问题描述】:

谁能给我一个 Javascript 中 Duck Typing 继承的例子?我正在探索 OO javascript,我听说过鸭子类型,但看不到在 javascript 中使用它的任何示例。

【问题讨论】:

标签: javascript oop


【解决方案1】:

Duck Typing”的规则是

如果它长得像鸭子,游泳像鸭子,叫起来像鸭子,那么它很可能就是鸭子。

在基于类的面向对象编程语言(例如 C++)中,要使两个对象看起来像鸭子,您必须从一个通用“接口”类继承它们的类,因此编译器会让您调用 duck方法。这称为强类型。

这就是它在 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 方法(谁在乎它们到底是什么)。

【讨论】:

  • 这绝对是最好的例子。它遵循“鸭子打字”的原始示例:换句话说,不要检查它是否是鸭子:检查它是否像鸭子一样嘎嘎,像鸭子一样走路等等,等等,具体取决于您需要玩语言游戏的鸭子行为的哪个子集。 (来自:haacked.com/archive/2014/01/04/duck-typing
  • 很好的答案,我在敲我的头,现在它很简单,为了让你的变量像另一个或对象一样的对象,你的变量应该具有另一个对象或对象的所有属性。所以只有我们可以称它为对象......所以如果它看起来像鸭子,像鸭子一样游泳,那么它的鸭子嘿嘿。
  • 这是鸭子打字时堆栈溢出的最明确答案。
【解决方案2】:

第二个链接给出了 js 中类似鸭子类型的模式的示例。不是说我建议这样做,但是……好吧,你要求的。 ;)

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

Wikipedia - Duck typing

最简单的方法是定义 非正式地签订合同,简单地依靠 两边的开发者 界面知道他们在做什么。 戴夫托马斯给出了这种方法 “鸭子打字”的名字——如果它走路 像鸭子,它像鸭子一样叫, 那么它是一只鸭子。同样与我们的 Shape 接口,如果它可以计算一个 面积和周长,那么它是 Shape.

JavaScript Interfaces and Duck Typing

【讨论】:

  • 太棒了,感谢您的回复。现在明白了,我想我将使用原型链坚持我的标准继承。
  • 维基百科中的 js 示例,不检查任何“walks”和“quacks”!这个例子不应该更新吗?
【解决方案3】:

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

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

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

for (let value of iterable) {
}

和数组

[...iterable]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 2011-05-11
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多