我熟悉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是否有办法?
答案 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 ,双关语意图)可能没有多大意义。