鸭子在 Javascript 中打字

IT技术 javascript oop
2021-02-25 14:56:58

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

3个回答

鸭子打字的规则

如果它看起来像鸭子,游泳像鸭子,叫声像鸭子,那么它很可能是鸭子。

在基于类的面向对象编程语言(例如 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
2021-04-26 14:56:58
很好的答案,我正在敲我的头,现在很简单,为了使您的变量像另一个或对象一样作为对象,您的变量应该具有另一个对象或对象的所有属性。所以只有我们可以称它为对象......所以如果它看起来像鸭子,像鸭子一样游泳,那么它的鸭子呵呵不错。
2021-05-11 14:56:58
这是关于鸭子类型堆栈溢出的最明确的答案。
2021-05-18 14:56:58

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

在使用面向对象编程语言的计算机编程中,duck 类型是一种动态类型,其中对象的当前方法和属性集确定有效语义,而不是从特定类或特定接口的实现继承。

维基百科 - 鸭子打字

最简单的方法是非正式地定义契约,并简单地依赖接口每一端的开发人员知道他们在做什么。Dave Thomas 将这种方法称为“鸭子打字”——如果它走路像鸭子,叫起来像鸭子,那么它就是一只鸭子。与我们的Shape界面类似 ,如果它可以计算面积和周长,那么它是 Shape.

JavaScript 接口和鸭子类型

维基百科中的 js 示例,不检查任何“散步”和“庸医”!!那个例子不应该更新吗?
2021-04-25 14:56:58
厉害了,谢谢回复。现在理解我想我将使用原型链坚持我的标准继承。
2021-05-19 14:56:58

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

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

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

for (let value of iterable) {
}

和数组

[...iterable]