Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法避免所有的;这";在Javascript对象中?_Javascript_Object - Fatal编程技术网

有没有办法避免所有的;这";在Javascript对象中?

有没有办法避免所有的;这";在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”,但我是否遗漏了什么 不,没有办法避免。您需要使用此为对象分配变量。您可以使用任何您喜欢的对象,只

当用构造函数定义JS对象时,有没有办法避免对每个对象属性使用“this”?看起来很难看。例如

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"