我典型的JS类结构如下:
MyClass = function(args)
{
this.myProp1 = undefined;
this.myProp2 = args[0];
//...more member data
this.foo = function()
{
return this.myProp1 + this.myProp2; //<- the problem.
}
//...more member functions
}
//if MyClass extends a superclass, add the following...
MyClass.prototype = Object.create(MySuperClass.prototype);
MyClass.prototype.constructor = MyClass;
...我对JS的不满之处在于,为了访问那些函数所属的同一对象的属性,我似乎不得不在成员函数中连续使用this
。用其他几种语言C#和Java,当成员函数使用相同类/实例中的成员数据时,可以安全地省略this
。 (我意识到JS的结构从根本上有所不同,这是因为JS被设计为原型而不是分层继承语言。)
以另一种方式提出问题:是否有任何方法可以使未指定的范围不指向window
,而是指向this
的当前局部值?
P.S。我猜想这是语言限制,但是我还是想再次检查一下。
[有一个关键字可以部分满足您的需求:with,但由于在某些情况下模棱两可,因此强烈建议您不要使用它]
如果访问不存在的成员,它将回退到window
对象。因此,您可以做的就是声明以后要使用的所有属性,然后声明with
语句。
如果我有选择的余地,我可能会改变主意,跳过this
,或者如果可以的话,使用另一种语言。
我不确定这是语言限制还是其他原因,但是您用于创建类和成员函数的模式无法帮助实现您想要的。
[使用其他几种语言,例如C#和Java,当成员函数使用同一类/实例中的成员数据时,可以安全地省略此操作。 (我意识到JS的结构从根本上有所不同,这是因为JS被设计为原型而不是分层继承语言。)
最好避免使用with
语句,因为with
语句的存在会禁用优化。另外,不能在严格模式下使用with
语句。请参阅ECMA 262§12.10.1:“严格模式代码可能不包含WithStatement
在此添加我自己的后代答案,因为在某个阶段,如果我被困在被迫(1)前置function Person$630(name$632) {
this.name = name$632;
}
var person$631 = new Person$630('Johnny Appleseed');
alert(person$631.name);
和(2)使用令人恐惧的this
之间,那么使用一个( 3)rd解决方案。