【发布时间】:2012-10-06 18:23:32
【问题描述】:
一些程序员建议不要在 Javascript 中使用伪经典继承,但建议使用鸭子类型并为每个对象提供一组功能。
有没有一个很好的例子来说明如何做到这一点?我在下面有一个示例,但它一次只分配一个功能。我们可以给一个对象分配一整组方法吗,比如我们可以设置一个OceanAnimal的原型,它可以“游泳”、“潜水”和“上升”,一个LandAnimal的原型用于“跑步”、“ walk”和“jump”,并让一个对象从其中一个或两个继承? (所以fish对象可以继承或获得OceanAnimal的能力,而乌龟可以同时获得OceanAnimal和LandAnimal的能力?)
var yoyo = {
name: "Yoyo",
type: "turtle"
}
var simba = {
name: "Simba",
type: "lion"
}
var dolphy = {
name: "Dolphy",
type: "dolphin"
}
function swim(n) {
console.log("My name is", this.name, ", I am a", this.type, "and I just swam", n, "feet")
}
function run(n) {
console.log("My name is", this.name, ", I am a", this.type, "and I just ran", n, "feet")
}
Object.prototype.respondTo = function(method) {
return !!(this[method] && (typeof this[method] === "function"));
}
yoyo.swim = swim;
yoyo.swim(10);
dolphy.swim = swim;
dolphy.swim(80);
simba.run = run;
simba.run(200);
yoyo.run = run;
yoyo.run(2);
yoyo.walk = run;
yoyo.walk(1);
console.log(simba.respondTo("swim"));
console.log(simba.respondTo("run"));
console.log(simba.respondTo("walk"));
console.log(yoyo.respondTo("run"));
console.log(yoyo.respondTo("walk"));
console.log(yoyo.respondTo("fly"));
if(dolphy.respondTo("run")) {
dolphy.run(10);
}
if(dolphy.respondTo("swim")) {
dolphy.swim(10);
}
输出:
My name is Yoyo , I am a turtle and I just swam 10 feet
My name is Dolphy , I am a dolphin and I just swam 80 feet
My name is Simba , I am a lion and I just ran 200 feet
My name is Yoyo , I am a turtle and I just ran 2 feet
My name is Yoyo , I am a turtle and I just ran 1 feet
false
true
false
true
true
false
My name is Dolphy , I am a dolphin and I just swam 10 feet
【问题讨论】:
-
我不清楚这是在问什么。
name和type的示例显示了 Duck-typing,因为方法/属性由隐式假设合约支持 - “它的行为就像鸭子,嘎嘎叫,因此......” -
顺便说一句,你可以写
return typeof this[method]=== 'function';。那也一样。 -
我在问...我们可以分配一整套方法而不是一个接一个...实际上是不是更好地首先创建一整套功能的原型,然后让对象拥有一整套(例如
LandAnimal,或者如果是Flyable,可能更好) -
要不创建一次性方法,请使用 Prototypes(“javascript 原型继承”可能是一个很好的搜索短语) - 这可以与“mass assignment”属性扩展结合使用(例如,复制所有目标对象或原型对象的“基础”对象中的方法)。
-
我们可以使用
Object.create来获得一组能力,但是我们如何获得另一组呢?是否有内置或通用方法,或者我们只是编写函数来复制所有属性...但是如果A具有属性x并且B也具有属性x怎么办?
标签: javascript