我开始学习JavaScript,经过多年的使用而不知道发生了什么,我觉得是时候做点什么了。另外,我正在开发一个项目,其中JavaScripts可用于编写应用程序脚本。
所以,在所有yada-yada中,我的问题与原型继承有关,我认为我知道它现在是如何工作的,但可能存在问题。基本的想法是每个对象(好吧,不是每个对象 - 是的;-))都有一个原型,如果实际对象无法处理它,直到到达原型链的末尾,所有请求都被委托给了(原型对象也可以有原型,对吗?)。
在我的应用程序中,大规模过滤将会发生,我想给用户(不是非常技术性的,应该尽可能简单。)一种链接简单过滤器命令的方法,使每个附加变量缩小结果集呼叫。我的意思是什么?水木清华。像这样:
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的原型设置为Container,从动物园获取数据。但我找不到从原型(容器)访问动物园的getAnimals()
方法的方法。我用this
试了一下,但找不到方法。
任何想法如何编写做我想做的代码?请注意,我不在浏览器环境中,我在我的应用程序中嵌入了JavaScript(1.7)。
谢谢!
答案 0 :(得分:1)
对象访问(原型)从中继承的东西的属性没有多大意义。例如,如果Cat
采用meow()
方法,则Mammal
引用meow()
会很奇怪。同样,如果Container
是getAnimals()
派生的Zoo
,Container
引用Container
会很奇怪。
我的建议是,要完成延迟加载,将传递一个将数组返回到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();
构造函数的访问器函数,而不是直接传递数组。这可能类似于:
{{1}}
答案 1 :(得分:0)
对象继承自内部原型,而非公共原型。
要实现链接,只需让每个方法返回实例。
e.g。
function Foo(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Foo.prototype.sayFirstName = function() {
alert(this.firstName);
return this;
}
Foo.prototype.sayLastName = function() {
alert(this.lastName);
return this;
}
var foo = new Foo('Foo', 'Bar');
foo.sayFirstName().sayLastName();
然而,链接不是一个好主意,因为它使调试变得困难。如果将一堆命令链接在一起并在单个语句或表达式中并且它失败了,那么如何找出哪一个失败?
您可能希望执行以下操作:
// 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);
}