有人能给我一个 JavaScript 中 Duck Typing 继承的例子吗?我正在探索 OO javascript,我听说过鸭子类型,但看不到它在 javascript 中使用的任何示例。
鸭子在 Javascript 中打字
“鸭子打字”的规则是
如果它看起来像鸭子,游泳像鸭子,叫声像鸭子,那么它很可能是鸭子。
在基于类的面向对象编程语言(例如 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
在两个对象上调用该方法(谁在乎它们到底是什么)。
第二个链接给出了 js 中类似鸭子类型的模式的示例。不是说我建议这样做,但是......好吧,你要求这样做。;)
在使用面向对象编程语言的计算机编程中,duck 类型是一种动态类型,其中对象的当前方法和属性集确定有效语义,而不是从特定类或特定接口的实现继承。
最简单的方法是非正式地定义契约,并简单地依赖接口每一端的开发人员知道他们在做什么。Dave Thomas 将这种方法称为“鸭子打字”——如果它走路像鸭子,叫起来像鸭子,那么它就是一只鸭子。与我们的
Shape
界面类似 ,如果它可以计算面积和周长,那么它是Shape
.
JavaScript 中鸭子类型的一个示例是iterables。JavaScript 实际上没有名为 的类型Iterable
,但它有一个对象的定义,它是可迭代的。
为了可迭代,对象必须实现@@iterator 方法
这是鸭子打字的要求。如果对象实现了在接口中定义的方法,则可以在接受接口类型的地方使用该对象。对于可迭代对象,循环就是这种情况
for (let value of iterable) {
}
和数组
[...iterable]