Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-原型继承问题和可能的一般理解问题_Javascript_Prototypal Inheritance - Fatal编程技术网

Javascript-原型继承问题和可能的一般理解问题

Javascript-原型继承问题和可能的一般理解问题,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我开始学习JavaScript,在多年使用它而不知道发生了什么之后,我决定是时候做点什么了。此外,我还从事一个项目,可以使用JavaScripts编写应用程序脚本 所以,在所有的yada-yada中,我的问题与原型遗传有关,我想我现在知道它是如何工作的,但可能会有问题。基本思想是每个对象(不是每个对象-是的;-))都有一个原型,如果实际对象在原型链的末尾无法处理它,那么所有请求都会委托给原型(对象的原型也可以有原型,对吧?) 在我的应用程序中,大量过滤即将发生,我想给用户(这不是很专业,应该尽可

我开始学习JavaScript,在多年使用它而不知道发生了什么之后,我决定是时候做点什么了。此外,我还从事一个项目,可以使用JavaScripts编写应用程序脚本

所以,在所有的yada-yada中,我的问题与原型遗传有关,我想我现在知道它是如何工作的,但可能会有问题。基本思想是每个对象(不是每个对象-是的;-))都有一个原型,如果实际对象在原型链的末尾无法处理它,那么所有请求都会委托给原型(对象的原型也可以有原型,对吧?)

在我的应用程序中,大量过滤即将发生,我想给用户(这不是很专业,应该尽可能简单)一种方法来链接简单的过滤命令,通过每次额外调用缩小结果集。我是什么意思?Smth。像这样:

zoo.getAnimals().getAnimalsWithFurColor("red").getMammals()
zoo
始终在范围内,是包含动物和动物园附加属性的对象。因此,我希望示例中的所有方法调用都能返回这样一个对象(我们称之为
Container
):

 {
   data: [harryTheElephant, sallyThePenguin, timTheWoodpecker],
   someFilterMethod: function() {
        return new Container(data.filter(function(animal) {
            return animal.someProperty == someValue;
        });
   }
 }
到目前为止,一切顺利。但我也希望动物园成为一个容器。这就是我真正的问题所在:因为动物园必须做一些非常昂贵的事情来找回最初的一组动物,我想懒洋洋地装载它们。当动物园收到
getAnimals()
请求获取数据

我的想法是将动物园的原型设置为一个容器,从动物园获取数据。但是我找不到从原型(容器)访问zoo中的
getAnimals()
方法的方法。我用
这个
试过了,但是找不到方法

有没有办法写出我想做的代码?请注意,我不是在浏览器环境中,我在应用程序中嵌入了JavaScript(1.7)


谢谢

对象从其内部原型继承,而不是从其公共原型继承

要实现链接,只需让每个方法返回实例

e、 g

然而,链接不是一个好主意,因为它使调试变得困难。如果您将一组命令链接在一起并放在一个语句或表达式中,但失败了,那么如何找出哪一个失败了

编辑 您可能需要执行以下操作:

// Container constructor
function Container(dataArray) {
  this.data = dataArray;
}

// Filter data and return new container
Container.prototype.getAnimalsWithFurColor = function(color) {
  var filteredArray = [];

  for (var i=0, iLen=this.data.length; i<iLen; i++) {

    // Presuming the items (animals?) in data have a getColor methed 
    if (this.data[i].getColor() == color) {
      filteredArray.push(this.data[i]);
    }
  }
  return new Container(filteredArray);
}
function Container(getAnimals) {
    this.someFilterMethod = function () {
        return new Container(function () {
            return getAnimals().filter(function (animal) {
                 return animal.someProperty === someValue;
            });
        });
    };

    this.get = getAnimals;
}

function makeZoo(animals) {
    var zoo = Object.create(new Container(function () { return animals; }));
    zoo.customZooMethod = function () { /* ... */ };

    return zoo;
}

var aZoo = makeZoo([harryTheElephant, sallyThePenguin, timTheWoodpecker]);
var filteredAnimals = aZoo.someFilterMethod().get();
//容器构造函数
函数容器(数据数组){
this.data=dataArray;
}
//筛选数据并返回新容器
Container.prototype.getAnimalsWithFurColor=函数(颜色){
var filteredArray=[];

对于(var i=0,iLen=this.data.length;i对象继承自其内部原型,而不是其公共原型

要实现链接,只需让每个方法返回实例

e、 g

然而,链接并不是一个好主意,因为它会使调试变得困难。如果将一组命令链接在一起,并在一个语句或表达式中,但它失败了,那么如何找出哪一个失败了

编辑 您可能需要执行以下操作:

// Container constructor
function Container(dataArray) {
  this.data = dataArray;
}

// Filter data and return new container
Container.prototype.getAnimalsWithFurColor = function(color) {
  var filteredArray = [];

  for (var i=0, iLen=this.data.length; i<iLen; i++) {

    // Presuming the items (animals?) in data have a getColor methed 
    if (this.data[i].getColor() == color) {
      filteredArray.push(this.data[i]);
    }
  }
  return new Container(filteredArray);
}
function Container(getAnimals) {
    this.someFilterMethod = function () {
        return new Container(function () {
            return getAnimals().filter(function (animal) {
                 return animal.someProperty === someValue;
            });
        });
    };

    this.get = getAnimals;
}

function makeZoo(animals) {
    var zoo = Object.create(new Container(function () { return animals; }));
    zoo.customZooMethod = function () { /* ... */ };

    return zoo;
}

var aZoo = makeZoo([harryTheElephant, sallyThePenguin, timTheWoodpecker]);
var filteredAnimals = aZoo.someFilterMethod().get();
//容器构造函数
函数容器(数据数组){
this.data=dataArray;
}
//筛选数据并返回新容器
Container.prototype.getAnimalsWithFurColor=函数(颜色){
var filteredArray=[];

对于(var i=0,iLen=this.data.length;i对象访问从它(原型)继承的东西的属性没有多大意义。例如,如果一个
Cat
有一个
meow()
方法,那么
哺乳动物
引用
meow()会很奇怪
。同样,如果
Zoo
是从
Container
派生出来的,那么
Container
引用
getanives()
也会很奇怪

我的建议是,为了完成延迟加载,将返回数组的访问器函数传递到
容器
构造函数中,而不是直接传递数组。这可能类似于:

// Container constructor
function Container(dataArray) {
  this.data = dataArray;
}

// Filter data and return new container
Container.prototype.getAnimalsWithFurColor = function(color) {
  var filteredArray = [];

  for (var i=0, iLen=this.data.length; i<iLen; i++) {

    // Presuming the items (animals?) in data have a getColor methed 
    if (this.data[i].getColor() == color) {
      filteredArray.push(this.data[i]);
    }
  }
  return new Container(filteredArray);
}
function Container(getAnimals) {
    this.someFilterMethod = function () {
        return new Container(function () {
            return getAnimals().filter(function (animal) {
                 return animal.someProperty === someValue;
            });
        });
    };

    this.get = getAnimals;
}

function makeZoo(animals) {
    var zoo = Object.create(new Container(function () { return animals; }));
    zoo.customZooMethod = function () { /* ... */ };

    return zoo;
}

var aZoo = makeZoo([harryTheElephant, sallyThePenguin, timTheWoodpecker]);
var filteredAnimals = aZoo.someFilterMethod().get();

对象访问(原型)继承自它的东西的属性没有多大意义。例如,如果一个
Cat
有一个
meow()
方法,那么
哺乳动物
引用
meow()
会很奇怪。同样地,
容器
引用
getAnimals()也会很奇怪
,如果
Zoo
是从
容器
派生的

我的建议是,为了完成延迟加载,将返回数组的访问器函数传递到
容器
构造函数中,而不是直接传递数组。这可能类似于:

// Container constructor
function Container(dataArray) {
  this.data = dataArray;
}

// Filter data and return new container
Container.prototype.getAnimalsWithFurColor = function(color) {
  var filteredArray = [];

  for (var i=0, iLen=this.data.length; i<iLen; i++) {

    // Presuming the items (animals?) in data have a getColor methed 
    if (this.data[i].getColor() == color) {
      filteredArray.push(this.data[i]);
    }
  }
  return new Container(filteredArray);
}
function Container(getAnimals) {
    this.someFilterMethod = function () {
        return new Container(function () {
            return getAnimals().filter(function (animal) {
                 return animal.someProperty === someValue;
            });
        });
    };

    this.get = getAnimals;
}

function makeZoo(animals) {
    var zoo = Object.create(new Container(function () { return animals; }));
    zoo.customZooMethod = function () { /* ... */ };

    return zoo;
}

var aZoo = makeZoo([harryTheElephant, sallyThePenguin, timTheWoodpecker]);
var filteredAnimals = aZoo.someFilterMethod().get();

这假设OP想要可变对象,这似乎不太可能;他可能希望每个筛选调用返回一个新实例。不管怎样,原理都是一样的。我得到了链接的基本概念,正如您在我的示例中看到的,该示例为每个筛选调用返回一个新容器。主要问题是从原型访问对象成员。我你可以在原型中使用
this
来实现这一点。它似乎对我不起作用……是否有任何情况下它不起作用?函数的this关键字是通过调用设置的,例如,将函数作为对象的方法调用会将函数的this设置为对象。你已经显示了一个对象和一些不连贯的代码,很难说是什么除非您发布一个“工作”示例,否则将继续。显然,getAnimals返回的对象必须具有getAnimalsWithFurColor方法,但您没有显示需要适当设置的函数的内部工作(如果您希望这样做的话)。这假设OP想要可变对象,这似乎不太可能;他可能希望每个筛选调用都返回一个新实例。不管怎样,原理都是一样的。我得到了链接的基本思想,正如您在我的示例中看到的,该示例为每个筛选器c返回一个新容器