JS类,对于成员访问,没有恒定引用“ this”的引用

问题描述 投票:5回答:5

我典型的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。我猜想这是语言限制,但是我还是想再次检查一下。

javascript class oop this
5个回答
2
投票

[有一个关键字可以部分满足您的需求:with,但由于在某些情况下模棱两可,因此强烈建议您不要使用它]

如果访问不存在的成员,它将回退到window对象。因此,您可以做的就是声明以后要使用的所有属性,然后声明with语句。

如果我有选择的余地,我可能会改变主意,跳过this,或者如果可以的话,使用另一种语言。


2
投票

我不确定这是语言限制还是其他原因,但是您用于创建类和成员函数的模式无法帮助实现您想要的。


1
投票

[使用其他几种语言,例如C#和Java,当成员函数使用同一类/实例中的成员数据时,可以安全地省略此操作。 (我意识到JS的结构从根本上有所不同,这是因为JS被设计为原型而不是分层继承语言。)


0
投票

最好避免使用with语句,因为with语句的存在会禁用优化。另外,不能在严格模式下使用with语句。请参阅ECMA 262§12.10.1:“严格模式代码可能不包含WithStatement


-1
投票

在此添加我自己的后代答案,因为在某个阶段,如果我被困在被迫(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解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.