javascript:一个函数可以在用new调用时创建一个静态变量吗?

时间:2015-07-25 00:34:15

标签: javascript

我熟悉java中的静态和实例变量。

我可以看到javascript没有关键字'static'

我可以看到一个函数和它本身可以看到的变量就像一个对象。

在javascript控制台上进行试验,我看到了

this.rrr =将在函数外部创建一个变量,如果使用new调用该函数,则会创建一个实例变量 - 对象上下文中的变量。如果函数是在没有new的情况下调用的,那么它只是将变量设置在自身之外,没有对象,所以它本质上是一个静态变量,它正在设置。

当然,毫无疑问与java一样,(如果我记得),一个对象可以引用静态变量,但静态方法不能引用实例变量。因此,如果我们在没有'new'的情况下调用函数,那么它就没有引用的实例变量。但是如果我们用new调用函数,那么它应该能够引用实例或静态变量。并且因为在javascript中可以在函数之外创建变量,所以应该可以创建实例变量或静态变量。我知道在没有new的情况下调用函数时,可以创建静态变量。当使用new创建它时,您可以创建一个实例变量..但是,当使用new创建函数时,您是否还可以创建一个静态变量?

我设置一个变量rrr = 1它本质上是一个静态变量,因为它不是任何对象的一部分。

>rrr=1
1

我知道this.rrr可以在p对象中设置rrr变量,或者可以设置静态rrr变量。而且我知道asd()这个名字是多余的,而且函数也可能是匿名的。

>var p=function asd() {this.rrr=55;}


>p();

>rrr
55

>rrr=1
1

我可以看到,在上面,p()将静态变量rrr设置为55 I然后将rrr设置为1

>rrr
1


>var q=new p(); 

>rrr
1

我知道q.rrr会由上面设定。

>q=p();

>rrr
55

以上结果均未让我感到惊讶。这一切都如预期的那样。但这些例子澄清了我的问题。

是否可以调用q = new p();并且在p函数中写入了什么,设置静态rrr?

就像java中的实例方法可以设置静态变量一样,在java中它通过指定类名点变量名来实现,而使用'this'。我想知道javascript是否有办法?

1 个答案:

答案 0 :(得分:2)

你函数中的

this.rrr=55;并没有真正创建一个“静态变量”,至少如果你的意思与Java中的静态类属性类似。 this只是引用全局窗口对象(因为你不像new p()那样处于“对象上下文”中,因此你刚刚创建了window.rrr,所以就这样了只是一个普通的全局变量。如果您刚刚在函数内部为rrr分配了一个值,效果就会一样......

  

那么javascript中的实例变量的术语是什么?就像this.rrr =在用'new'调用函数时创建的那样?

考虑这个例子:

function Foo() {
    this.bar = 1;
    var baz = 2;
}

var someObj = new Foo();

console.log(someObj.bar); // this will get you 1
console.log(someObj.baz); // this will only get you undefined

因此,对象上下文中的this.bar与可从外部访问的public属性相当,而var baz是函数作用域的本地属性(因为var关键字),因此与private属性相当。

我宁愿说“可比”,也不完全相同......因为JavaScript现在不是“类”的概念,而是(函数)对象,应用与“经典”OOP相同的术语(ha ,双关语意图)可能没有多大意义。