有没有办法避免所有的;这";在Javascript对象中?
当用构造函数定义JS对象时,有没有办法避免对每个对象属性使用“this”?看起来很难看。例如有没有办法避免所有的;这";在Javascript对象中?,javascript,object,Javascript,Object,当用构造函数定义JS对象时,有没有办法避免对每个对象属性使用“this”?看起来很难看。例如 function Thingy(abc) { this.var1 = abc; this.var2 = this.var1 + " hello "; // etc } var myObj = new Thingy(); 似乎我应该能够使用“var2”,然后省去“this”而只引用“var2”,但我是否遗漏了什么 不,没有办法避免。您需要使用此为对象分配变量。您可以使用任何您喜欢的对象,只
function Thingy(abc) {
this.var1 = abc;
this.var2 = this.var1 + " hello ";
// etc
}
var myObj = new Thingy();
似乎我应该能够使用“var2”,然后省去“this”而只引用“var2”,但我是否遗漏了什么 不,没有办法避免。您需要使用
此
为对象分配变量。您可以使用任何您喜欢的对象,只需在末尾返回它,例如:
function Thingy(abc) {
var thingy = {};
thingy.var1 = abc;
thingy.var2 = thingy.var1 + " hello ";
return thingy;
}
或
或
或
试一试
好吧,恐怕您已经了解了语言的设计方式
但在某种意义上,您可以使用构造函数中的普通var
语句。在其中创建的任何函数都可以访问包含以下属性的闭包:
function Thingy(abc) {
var var1 = abc;
this.func1 = function(str) {return var1 + ", hello";};
}
var thing1 = new Thingy("Dan");
thing1.func1(); // => "Dan, hello"
请注意,这是如何将完全私有的变量封装到对象中的,因此这通常是一种有用的技术。可以避免使用它们。但在某些情况下,它们提供了一些可实现性,并避免了变量名称相同但作用域不同时的歧义。您可以轻松使用var var2=42
,并将该值称为var2
,但问题是,您的函数有什么用途?!您可以执行var-var2
,但如果执行该操作,var2
将只能在Thingy
内部访问(它将是私有的)。您可以使用var
,但它将使变量成为私有的。与中一样,您唯一可以访问它们的地方是您的函数的作用域。你不能用myObj.var1
引用来支持你的陈述?@Samuel:你希望引用什么样的引用?如果您编写var1=…
,您将创建一个全局变量(或将该值赋给在更高范围内定义的变量)var var1=…
将创建一个局部变量。将属性分配给对象总是使用obj.propertyName=…
,因此必须使用this.propertyName=…
。如果您愿意,我可以引用规范:;)@FelixKling那么创建一个局部变量并使用“getter”有什么不对呢?OP询问是否有任何方法可以避免使用this
。我认为ScottSauyet的回答是正确的。同时,这取决于OP试图做什么,以确定什么值得做什么。它并不是在使用大量额外/混乱的代码或其他东西来使它疯狂。但是他的答案肯定是适用的,所以答案“不”对我来说并不正确。@Ian:我以为我是这么说的!:-)@ScottSauyet是的,我想我只是需要自己把它打出来,以确保我理解:)但当然,其中很多都会带来某些低效,扔掉最初创建的这个对象。我没有说它更高效,我只是简单地回答了他的问题:)我对此投了赞成票,并警告说这不是很好的编程实践。。。太让开发人员困惑了,以至于他们不知道“var1”的意思是“this.var1”。。。我的$0.02…with
不能以这种方式工作,将在严格模式下抛出错误。这将在全局范围内创建var1
和var2
。谢谢!这似乎是最好的“默认”方式。事实上,我能看到的唯一区别是thing1.var1不再可访问,提供了更多的隐私和更干净的代码。奇怪的是,我发现所有使用此对象构造函数方法的示例都使用了“this”。不过,这也有很大的缺点。请注意,原型函数无权访问此属性。该语言强制在极端封装和更好的内存管理之间进行权衡。
function Thingy(abc) {
return {
var1: abc,
var2: abc + " hello "
};
}
function Thingy(abc) {
var var1 = abc,
var2 = var1;
var2 += " hello ";
return {
var1: var1,
var2: var2
};
}
function Thingy(abc) {
with(this)
{
var1 = abc;
var2 = this.var1 + " hello ";
// etc
}
}
function Thingy(abc) {
var var1 = abc;
this.func1 = function(str) {return var1 + ", hello";};
}
var thing1 = new Thingy("Dan");
thing1.func1(); // => "Dan, hello"