如何将一种方法连接到不同的对象?

时间:2015-10-27 12:37:29

标签: javascript object

在Javascript中学习对象和原型时遇到的练习可以指导我一点吗?

让我们说我必须用3只动物(猫鸟虫)制作简单的食物链。

它应该以下面的输出可行的方式实现3个对象(所有对象应该实现相同的方法“吃”):

    var cat1 = Object.create(Cat);
var cat2 = Object.create(Cat);
var bird = Object.create(Bird);
var worm = Object.create(Worm);
cat1.eat(bird); // "Tasty!"
cat2.eat(bird); // "Tasty!"
bird.eat(worm); // "Tasty!"
worm.eat(cat1); // "Bleeh!"
cat1.eat(cat2); // "Bleeh!"

所以当我创建对象时:

var Cat  = {
   eat = function(){}
};
var Bird = {
   eat = function (){}
};
var Worm = {
   eat = function (){}
};

我应该把“如果”的陈述确定何时返回适当的值?(猫吃鸟,鸟吃虫,鸟不能吃鸟等)还有其他任何方法写一种方法吃到所有人动物?

3 个答案:

答案 0 :(得分:1)

你可以采用的一种方法是定义一个动物“类”,它是JS中的一个函数(至少在ES5中)。然后,您可以创建将继承Animal类的Cat“类”,并在其中定义它所吃的内容。 eat函数将是Animal类中的通用函数,这样您就不必每次都使用不同的值来覆盖它。

var Animal = function() {
    this.canEat = [];
}
Animal.prototype.eat = function (animal) { 
    if (this.canEat && this.canEat.indexOf(animal) !== -1) {
        console.log('Yum!'); 
    }
    else {
        console.log('Bleh!');
    }

};

var Cat = function() {
    this.canEat = ['bird'];
}

// Inheritance
Cat.prototype = Object.create(Animal.prototype);

var cat = new Cat();
cat.eat('bird');  // Yum!
cat.eat('cat');   // Bleh!

Fiddle

答案 1 :(得分:1)

你必须以适当的方式组织对象,你必须继承。

var Animal = {
  // set food chain hierarchy
  // worm -> 1, birds -> 2, cat -> 3, lion -> 4
  level: 0,
  eat: function(otherAnimal) {
    return this.level > otherAnimal.level ? 'Tasty':'Bleeh';
  },
  init: function(level){
    this.level = level;
    return this;
  }
};

var cat1 = Object.create(Animal).init(3);
var cat2 = Object.create(cat1);
var bird = Object.create(Animal).init(2);
var worm = Object.create(Animal).init(1);

cat1.eat(bird); // "Tasty!"
cat2.eat(bird); // "Tasty!"
bird.eat(worm); // "Tasty!"
worm.eat(cat1); // "Bleeh!"
cat1.eat(cat2); // "Bleeh!"

答案 2 :(得分:0)

工作Fiddle

function Organism(){};
function Cat(){};
function Bird(){};
function Worm(){};

Organism.prototype.eat = function(food){
    if(this.level > food.level){
        console.log('Tasty!');
    } else {
        console.log('Bleeh!');
    }
}

Cat.prototype = new Organism();
Cat.prototype.level = 3;

Bird.prototype = new Organism();
Bird.prototype.level = 2;

Worm.prototype = new Organism();
Worm.prototype.level = 1;

var cat1 = new Cat();
var cat2 = new Cat();
var bird = new Bird();
var worm = new Worm();

cat1.eat(bird); // "Tasty!"
cat2.eat(bird); // "Tasty!"
bird.eat(worm); // "Tasty!"
worm.eat(cat1); // "Bleeh!"
cat1.eat(cat2); // "Bleeh!"