我典型的 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 的结构根本不同,因为它被设计为原型语言而不是分层继承语言。)
换句话说:有没有办法让未指定的范围不指向window
,而是当前的局部值this
?
附:我猜这是语言限制,但我想我还是会再次检查。
在其他几种语言中,例如C# 和 Java,当成员函数处理同一类/实例中的成员数据时,可以安全地省略此项。 (我意识到 JS 的结构根本不同,因为它被设计为原型语言而不是分层继承语言。)
这与继承链无关,继承链在 js 中也是相当静态的。这是关于 JS 是一种动态语言,全局作用域能够随意添加新变量,并且对象可以用任意属性进行修改。
因此,让标识符动态解析为局部变量或对象属性实际上是不可能的,我们希望每次都使用属性访问器进行属性访问来明确区分它们。
有什么方法可以使未指定的范围不指向 window,而是指向 this 的当前本地值?
“未指定范围”是局部范围,是静态确定和优化的。要使其指向一个对象(如果未找到该属性,则返回到变量),您可以使用with陈述 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with。然而,由于这种模糊性,它不仅速度慢,而且被认为是不好的做法——(变量)的查找可能会受到非本地代码(与实例交互)的影响,这会破坏封装,并且是一个可维护性问题。
我典型的 JS 类结构......
当然,您也可以更改它,并使用通过闭包访问的局部变量作为成员(另请参阅Javascript:我需要为对象中的每个变量放置 this.var 吗? https://stackoverflow.com/q/13418669/1048572)。这解决了以下问题this
,但也是慢一点 https://stackoverflow.com/q/12180790/1048572(虽然可能仍然比with
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)