我在 Javascript 方面没有经验,刚刚开始了解应该如何使用它,所以我的意见不应该与有特定语言经验的人一样重要。我会对我的想法的回应感兴趣。
我一直在尝试一种定义类对象的风格,这种对象依赖于 Javascript with语句。我认为这是合法使用。
这种风格中的每个类对象都作为对象的工厂来满足某些目的。
这种风格没有在实例方法中使用this关键字。
这种风格认为从这些类对象之一生成的每个对象都具有公共方面和私有方面。一个 Javascript 对象代表了这些方面中的每一个。对象引用的持有者实际上只指公共方面。然而,这些方法知道这两个方面,我用闭包来实现这一点。
我不会假装这种风格适用于我们非常关心运行时间或内存性能的情况。我故意牺牲了其中的相当一部分来提高编程效率。我希望找到很多我想要快速编程并且几乎没有错误机会的情况,并且运行时的需求并不重要。
由于我一直在尝试在浏览器而不是 node.js 中编写代码,因此对我来说开发环境的一个实际考虑是大型源文件中的语法错误可能难以确定和纠正。我通过以小增量添加代码来解决这个问题。因此,我希望类对象能够一次接受一个实例方法定义,而不是要求所有方法定义都出现在一个源文件中。
我最初声明了一个类对象,其中没有定义任何实例方法,然后我将类对象放在我正在编程的任何命名空间中。
然后我在一个名为“init”的方法中重复调用类对象,每次,我传递一个初始化器,一个在实例初始化期间调用的函数。
最终,当我开始使用类对象作为其实例的工厂时,每当我向它请求新实例时,它都会为实例创建公共和私有方面,将私有方面链接到公共方面,然后调用所有已定义的初始化程序,将新实例的私有方面传递给它们。
在我的风格中,每个公共属性都是一种方法。所有值不是函数的变量都应该存在于私有端。
初始化器可以做的一件事是在私有端建立一个变量。
初始化器可以做的另一件事是在公共端或私有端添加一个方法。
执行初始化程序的顺序很重要——类对象需要以与定义它们的顺序相同的顺序执行它们。因此,每个初始化器都可以依赖实例的公共和私有方面,这些实例具有由早期初始化器建立的属性。对于程序员来说,这实际上创建了一对词法作用域,因为初始化器不是由任何类型的条件或动态代码建立的;它们是在浏览器读取和解析源文件后立即执行的。
现在在某些语言中,特别是 Ruby 语言和 Self 语言,您可以编写一个裸标识符并将其解释为对当前对象的方法调用。所以在 Ruby 中,“foo”可以表示“self.foo”,而在 Self 中,“foo”可以表示“self foo”(这些语言的方法调用语法不同,但要达到我所说的详细程度现在的语义,Ruby中的“self.foo”和Self中的“self foo”是相同的)。这个不存在“self”的缩写对于调用私有方法和实例变量特别方便。Javascript 语言不提供这种便利。
在实例方法内部的上下文中,我想使用私有或公共端的属性作为其值(注意,不是在赋值的左侧),我喜欢仅通过名称引用属性的便利并且不必写“vars”。或“自我”。在它的左侧找到它(我使用“vars”表示私有方面,“self”表示公共方面)。出于这个原因,我将每个初始化程序包装在 Javascript中陈述。这对我来说似乎是合理的,因为在我的风格中,目标对象的总体是在词汇上建立的。要查看属性,程序员只需查看前面在源文件中为同一个类对象提供的初始化程序(它本身在源代码中由名称标识,因此出于软件工程目的,我们可以将其视为一个词法实体,即使没有 Javascript 解析器检测到这一点)。