在JS类中这样定义的变量怎么变成了静态变量?一直累加。我知道用this就可以,但我想知道为什么。 静态变量?用this就可以?说啥呢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 上面的alert(_abc); 应该每次都是1,但它一直会累加,不知道为什么?你多点几次按钮嘛 function ClassA() { if(typeof ClassA._initialized == "undefined") { ClassA._abc = 0; ClassA.prototype.m1 = function() { ClassA._abc++; alert(ClassA._abc); } } ClassA._initialized = true; } 这样应该比较容易理解 因为变量_abc始终在function ClassA的作用域中,也就是该作用域的“全局变量”,所以每次都会加一。而用this时,每次new 都新建了一个ClassA的实例,也就是新建了一个作用域,所以不会出现这个现象。 cloudgamer说的和做的,我基本上都能明白。不要讨论我的代码的正确与否,我只想明白为什么会累加。每次都new 了一个实例啊!难道_abc不是在当前实例的作用域中吗?liuhongxing1908901能否讲得更详细一点?恕我愚钝。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title> Untitled Document </title> <script type="text/javascript"> function ClassA() { this._abc = 0; if(typeof ClassA._initialized == "undefined") { ClassA.prototype.m1 = function() { this._abc++; alert(this._abc); } } ClassA._initialized = true; } function test1() { var a1 = new ClassA(); a1.m1(); } function test2() { var a2 = new ClassA(); a2.m1(); } </script> </head> <body> <input id="Button1" type="button" value="test1" onclick ="test1();"/> <input id="Button2" type="button" value="test2" onclick ="test2();"/> </body> </html> 偶没说lz的错啊偶那个只是用来了解的就是_abc是属于ClassA的而不是ClassA的实例的那些实例的m1的作用只是修改了ClassA的_abc变量的值再显示如果用this那么_abc就属于ClassA的实例的了这个确实难理解偶也是一知半解 你看这个代码,点击按钮1和2,_abc会一直累加。 点按钮3,总是显示6。_abc有两个值,那就说明_abc又并不属于ClassA越来越糊涂了,想哭。在类的实例中,用this定义公有变量,如何定义私有变量?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Untitled Document</title><script type="text/javascript">function ClassA(){ var _abc = 5; this.m2 = function() { _abc++; alert(_abc); } if(typeof ClassA._initialized == "undefined") { ClassA.prototype.m1 = function() { _abc++; alert(_abc); } } ClassA._initialized = true;}var a1 = new ClassA();function test1(){ a1.m2();}function test2(){ a1.m1();}function test3(){ var a2 = new ClassA(); a2.m2();}</script> </head> <body> <input id="Button1" type="button" value="test1" onclick ="test1();"/> <input id="Button1" type="button" value="test2" onclick ="test2();"/> <input id="Button2" type="button" value="test3" onclick ="test3();"/> </body></html> function ClassA() { ClassA._abc = 5; this.m2 = function() { ClassA._abc++; alert(ClassA._abc); } if(typeof ClassA._initialized == "undefined") { ClassA.prototype.m1 = function() { ClassA._abc++; alert(ClassA._abc); } } ClassA._initialized = true; }每new一次就相当于运行一次ClassA即ClassA._abc重新赋值一次(等于5)那m2的时候当然是6了 a1是个全局变量,所以test1和test2每次点击都在同一个作用域中操作。a2是test3的局部变量,每次点击都会产生一个新的ClassA实例,所以不会累加。LZ看来就是要拼命绕糊涂啊。 10楼的写法是比较清晰的。关键是设计类时你就要清楚,那些属性是类属性,那些属性是对象属性。类属性就写成ClassA.XXX,对象属性就写成this.XXX,不一定要用原帖的那种表达方式啊。js的作用域机制其实就是绑定在对象上的。全局变量绑在window上,局部变量绑在相应的function(类)上的。 9楼的,你的a1属于全局对象,test1()与test2() 都不是新建立对象,所以,值是变化的。a2嘛,是局部的,就算不是局部的,10楼也给解释了。 function _x() { var x = 0; var _setValue = function(value) { x = value; }; var _getValue = function() { return x; }; this.setValue = function(value) { _setValue(value); }; this.getValue = function() { return _getValue(); }; this.tellMeWhoAreYou = function() { alert("I'm _x"); };}function _y() { this.tellMeWhoAreYou = function() { alert("I'm _y"); };}_y.prototype = new _x();var x = new _x();var y = new _y();x.setValue(3);alert(x.getValue());y.setValue(5);alert(y.getValue());alert("x._getValue is " + typeof x._getValue);alert("y._getValue is " + typeof y._getValue);原理是利用变量的作用域, 因为_getValue 与 _setValue 的作用域只存在于 function _x() { } 之间,所只能在内部访问,而外部却访问不了.. 16楼的意思是不是:因为m1()在function ClassA() {}里,所以,每次调用m1()时,说白了,_abc是同一个 ? 引用菜农的"因为变量_abc始终在function ClassA的作用域中,也就是该作用域的“全局变量”,所以每次都会加一。 而用this时,每次new 都新建了一个ClassA的实例,也就是新建了一个作用域,所以不会出现这个现象" 收藏了……为什么javascript没有一个docment呢…… 因为你的M1是引用的第一次 new 出来的实例的 _abc后面new 出来 也是调用的 第一个实例的m1(这里注意m1里的_abc); 后面虽然有单独的_abc但是M1 始终会 使用 第一个实例的_abc我是这样理解的 javascript的一个语法问题 .cx和.cy是什么 菜鸟提问:关于 window.navigator的问题 随意拖拽一个模块调换位置,有请JK_10000 求助,一个字符串操作问题 如何在自定义对象中取得定义变量时的名称 控制frame的隐现 一个简单的问题,不过很着急 如何获得在一个页面中的link的编号? 用js实现before和after伪类的样式修改 小窗口 问:js中的location.href被指定值后,就会执行跳转,请大家解释下是如何工作的?
你多点几次按钮嘛
{
if(typeof ClassA._initialized == "undefined")
{
ClassA._abc = 0;
ClassA.prototype.m1 = function()
{
ClassA._abc++;
alert(ClassA._abc);
}
}
ClassA._initialized = true;
} 这样应该比较容易理解
而用this时,每次new 都新建了一个ClassA的实例,也就是新建了一个作用域,所以不会出现这个现象。
不要讨论我的代码的正确与否,我只想明白为什么会累加。
每次都new 了一个实例啊!难道_abc不是在当前实例的作用域中吗?
liuhongxing1908901能否讲得更详细一点?恕我愚钝。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title> Untitled Document </title>
<script type="text/javascript">
function ClassA()
{
this._abc = 0;
if(typeof ClassA._initialized == "undefined")
{
ClassA.prototype.m1 = function()
{
this._abc++;
alert(this._abc);
}
}
ClassA._initialized = true;
} function test1()
{
var a1 = new ClassA();
a1.m1();
}
function test2()
{
var a2 = new ClassA();
a2.m1();
}
</script>
</head>
<body>
<input id="Button1" type="button" value="test1" onclick ="test1();"/>
<input id="Button2" type="button" value="test2" onclick ="test2();"/>
</body>
</html>
偶那个只是用来了解的
就是_abc是属于ClassA的而不是ClassA的实例的
那些实例的m1的作用只是修改了ClassA的_abc变量的值再显示
如果用this那么_abc就属于ClassA的实例的了
这个确实难理解
偶也是一知半解
_abc有两个值,那就说明_abc又并不属于ClassA
越来越糊涂了,想哭。
在类的实例中,用this定义公有变量,如何定义私有变量?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<script type="text/javascript">
function ClassA()
{
var _abc = 5;
this.m2 = function()
{
_abc++;
alert(_abc);
}
if(typeof ClassA._initialized == "undefined")
{
ClassA.prototype.m1 = function()
{
_abc++;
alert(_abc);
}
}
ClassA._initialized = true;
}
var a1 = new ClassA();
function test1()
{
a1.m2();
}
function test2()
{
a1.m1();
}
function test3()
{
var a2 = new ClassA();
a2.m2();
}
</script>
</head>
<body>
<input id="Button1" type="button" value="test1" onclick ="test1();"/>
<input id="Button1" type="button" value="test2" onclick ="test2();"/>
<input id="Button2" type="button" value="test3" onclick ="test3();"/>
</body>
</html>
{
ClassA._abc = 5;
this.m2 = function()
{
ClassA._abc++;
alert(ClassA._abc);
}
if(typeof ClassA._initialized == "undefined")
{
ClassA.prototype.m1 = function()
{
ClassA._abc++;
alert(ClassA._abc);
}
}
ClassA._initialized = true;
}每new一次就相当于运行一次ClassA即ClassA._abc重新赋值一次(等于5)
那m2的时候当然是6了
关键是设计类时你就要清楚,那些属性是类属性,那些属性是对象属性。类属性就写成ClassA.XXX,对象属性就写成this.XXX,不一定要用原帖的那种表达方式啊。
js的作用域机制其实就是绑定在对象上的。全局变量绑在window上,局部变量绑在相应的function(类)上的。
a2嘛,是局部的,就算不是局部的,10楼也给解释了。
function _x() {
var x = 0;
var _setValue = function(value) {
x = value;
};
var _getValue = function() {
return x;
};
this.setValue = function(value) {
_setValue(value);
};
this.getValue = function() {
return _getValue();
};
this.tellMeWhoAreYou = function() {
alert("I'm _x");
};
}
function _y() {
this.tellMeWhoAreYou = function() {
alert("I'm _y");
};
}
_y.prototype = new _x();
var x = new _x();
var y = new _y();
x.setValue(3);
alert(x.getValue());
y.setValue(5);
alert(y.getValue());
alert("x._getValue is " + typeof x._getValue);
alert("y._getValue is " + typeof y._getValue);原理是利用变量的作用域, 因为_getValue 与 _setValue 的作用域只存在于 function _x() { } 之间,所只能在内部访问,而外部却访问不了..
所以,每次调用m1()时,说白了,_abc是同一个 ?
而用this时,每次new 都新建了一个ClassA的实例,也就是新建了一个作用域,所以不会出现这个现象"
为什么javascript没有一个docment呢……
但是M1 始终会 使用 第一个实例的_abc我是这样理解的