我正在尝试做一个小型JavaScript实验室。在实验室中,我首先创建了一个Animal对象:
function Animal(species, nature) {
this.species = species;
this.nature = nature;
var preys = new Array();
Animal.prototype.getSpecies = function() {
return species;
}
Animal.prototype.getNature = function() {
return nature;
}
Animal.prototype.getPreys = function () {
return preys;
}
Animal.prototype.setNature = function (newNature) {
nature = newNature;
}
Animal.prototype.setSpecies = function (newSpecies) {
species = newSpecies;
}
Animal.prototype.setPrey = function (newPreys) {
preys = newPreys;
}
}
然后,我创建了一个World对象,它基本上会存储一些动物对象,并根据它们的性质将它们分开。
/// <reference path="Animal.js" />
function World() {
var animals = new Array();
animals.push(new Animal("Wolf", "Carnivore"));
animals.push(new Animal("Crocodile", "Carnivore"));
animals.push(new Animal("Sheep", "Omnivore"));
World.prototype.getOmnivores = function () {
return animals.filter(getOmnivores());
}
function getOmnivores(animal) {
}
}
在我的getOmnivors
函数中,我不能将Animal
类用作变量。这对我来说有点复杂,因为我是JavaScript的新手,无论他们的类型如何,我们都使用var
关键字(或者不在某些地方使用,例如函数中的参数)。
我做错了什么,我该如何解决?我无法访问私人函数Animal
中的getOmnivores
类。我认为程序不明白它是名为Animal
我希望我解释得很好。祝你有愉快的一天!
修改
答案 0 :(得分:2)
Animal
是类名,你不需要它。使用filter
时,数组的每个元素都会自动作为该函数的第一个参数传递给回调函数。
由于数组的每个元素都是类Animal
的实例,因此您可以立即使用它。
此外,语法{ClassName}.Prototype.{functionName}
不应在同一个类中使用,因为在解释器到达该行时,尚未定义Animal类。该语法用于已存在和已定义的类。请改用this.{functionName}
。
function Animal(species, nature) {
this.species = species;
this.nature = nature;
this.preys = new Array();
this.getSpecies = function() {
return this.species;
}
this.getNature = function() {
return this.nature;
}
this.getPreys = function () {
return this.preys;
}
this.setNature = function (newNature) {
this.nature = newNature;
}
this.setSpecies = function (newSpecies) {
this.species = newSpecies;
}
this.setPrey = function (newPreys) {
this.preys = newPreys;
}
}
function World() {
var animals = new Array();
animals.push(new Animal("Wolf", "Carnivore"));
animals.push(new Animal("Crocodile", "Carnivore"));
animals.push(new Animal("Sheep", "Omnivore"));
this.getOmnivores = function () {
return animals.filter(this.filterOmnivores);
}
this.filterOmnivores= function(animal) {
return animal.getNature()=='Omnivore';
}
}
myworld = new World();
console.log(myworld.getOmnivores());
的工作小提琴
答案 1 :(得分:1)
filter method将函数作为参数。
您必须提供该功能,但在您的代码中,您立即调用该功能:
World.prototype.getOmnivores = function () {
return animals.filter(getOmnivores());
}
删除括号以仅提供函数而不调用它,或插入匿名函数:
World.prototype.getOmnivores = function () {
return animals.filter(getOmnivores);
}
// or
World.prototype.getOmnivores = function () {
return animals.filter(function (animal) {
return animal.nature === "omnivore";
});
}
答案 2 :(得分:1)
您需要将函数作为参数传递,而不是将其返回。
return animals.filter(isOmnivore);
isOmnivore
变为
function isOmnivore(animal) {
animal.nature == 'Omnivore';
}