【发布时间】:2013-09-29 00:11:51
【问题描述】:
我想要实现的是在 JavaScript 中创建一些对对象属性进行操作的函数,这是一个相当典型的事情。
问题在于,出于灵活性和可扩展性的考虑,我不希望函数提前了解对象。据我所知,这正是 Javascript 应该非常擅长的事情,但由于没有花很多时间在函数式语言上,我还没有掌握如何去做。
所以我可能会遇到这样的情况:
function Owner()
{
var self=this;
self.size = 100;
self.writers = [];
}
function Writers()
{
var Alice= function()
{
var that=this;
that.name="alice";
that.operate = function()
{
console.log( "Alice says: "+self.size );
}
}
this.alice=new Alice();
}
var owner = new Owner();
var writers = new Writers();
owner.writers.push( writers.alice );
owner.writers[0].operate();
现在返回Alice Says: undefined,这一切都很好,但不是我想要的——我显然希望看到Alice Says: 100。在经典语言中,我可能不得不向 Alice 函数提供对所有者的引用(在伪 C# 中):
public class Owner()
{
private List<Writer> writers;
public Owner()
{
this.size=100;
this.writers= List<Writer>();
}
public int Size{ get; set; }
public void AddWriter( Writer writer )
{
writer.Owner = this;
this.writers.Add(writer);
}
}
public class Writer
{
private Owner owner;
private string name;
public void Writer( string name )
{
this.name=name;
}
public void operate()
{
Console.WriteLine( "{0} says: {1}", name, owner.Size );
}
}
据我所知,这不是非常 Javascripty - 似乎应该有更好的 - 或者至少更惯用的方式。
就我正在使用的代码的实际目标而言(基本上是这样,但更复杂),目标是能够添加任意数量的“Writer”类,这些类可以对“Owner”执行操作" 它们所附加的实例。这基本上是Decorator 模式的实现,我可以想出很多方法来实现它,但正如我所说,我正在寻找了解 Javascript 的功能/原型性质如何在这种情况下帮助我这样我可以更好地掌握语言。
我也不完全满意我通过实例传递函数的方式——我觉得我应该能够像五彩纸屑一样在周围扔函数,所以任何关于如何与变量范围交互的提示都是很有帮助。
如果事实证明我正在尝试做的是倒退,并且有更好的方法来实现这种目标,那也很好。我正在尝试学习 Javascript 中的好语言,但事实证明这很棘手,但我学到了很多东西。
编辑:我的目标是有一个基本类型,我在设计它时不必知道它可能必须执行的操作的完整列表,并且我不必为每个不同创建一个新的子类可用操作的组合,确保我的操作与我的核心类型分离。
所以如果我有一个Animal 类型,然后我的操作是Eat、Run、Grow 等等,那么理想情况下我会调用myAnimal.can("Eat") 类型(我意识到这有点像hasOwnProperty,但我假设这些操作属于特定的基本类型),这将通知我该操作是否可用,然后如果它可以访问,则类似于myAnimal.actions.Eat("leaves")。当调用Eat 操作时,它会影响父myAnimal 对象的属性。在myAnimal 的生命周期中,它可能会在任何时候添加或删除能力,但只要检查它can 所做的事情应该足以满足我的需求。
【问题讨论】:
-
Owner是什么?看不懂楼主怎么有大小和写手...Owner和Writers是什么关系?所以爱丽丝是作家?我不确定这些名字是否显而易见,也不确定它们之间的关系是什么。此外,self超出了那里的范围,所以很明显你会得到undefined。that=this和self=this对您没有帮助,它们似乎没有必要。 -
Alice函数不知道变量self -
除了
self的问题,我看到的主要问题是数据没有正确建模,所以我们无法理解目标......Writers应该是Writer和方法应该在原型中。还应该与Owner有明确的关系,因此您可以继承size并在Writer中使用它,但这意味着作家是所有者,嗯……我同意乔西蒙斯的观点,一些伪代码会帮助,或者用另一种语言对数据进行建模。 -
您仍然在用计算机科学术语描述您正在尝试做的事情(例如实现装饰器模式),而不是告诉我们您真正想要解决的问题。对我来说,如果我能找到您试图解决的根本问题,而不是被问到如何将 C# 概念映射到 JS,那么更容易知道如何在 javascript 中最好地完成某些事情。映射通常是不完美且未优化的,因为语言具有不同的优势/劣势。如果您了解问题的真正目标,就更容易将语言的优势应用到问题上。
-
@glenatron - 计算机科学与 javascript 配合得很好。只是解决问题的“最佳”方法(用任何语言)取决于问题,而不是您正在考虑使用的算法。 SO上有太多问题询问某人正在寻求的解决方案有什么问题,而没有描述实际问题。如果不了解要解决的实际问题,而不仅仅是您的预期解决方案,我们永远无法为您提供最佳答案。
标签: javascript scope prototype-programming