javascript继承不理解 因为你调用了 SetName()就将height设置为177le 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个我知道,难道可以继承heigth,它是个私有成员啊!难到能继承?? <html><head><meta http-equiv="Content-Type" content="text/html; charset=shift_jis"><title>新しいページ 1</title><script>function MyUser() { public: this.name="L.L.L"; this.year=22; this.Say=function() { alert(this.name); alert(this.heigth); } private: this.heigth=163; } function YourUser() { EXTENDS: this.Super=MyUser; this.Super(); public: this.SetName=function() { this.name="J.J.J"; heigth=177; } } function GetPersonValue() { var youru=new YourUser(); youru.SetName(); youru.Say();} window.onload=GetPersonValue;</script></head><body></body></html> ,奇怪的写法??javascript的继承只能通过prototype来模拟c++,java等的继承不是么???没见过这种写法,待高人解惑 LZ这里的public,private仅仅是作为标号名称而已,没有任何其他含义like thisvar outer = 1;public:for(;;){ document.write("The outer is : " + outer + "<br>"); outer++; var inner = 1; private: for(;;){ if(outer>5) break public; if(inner>5) break private; document.write("The inner is : " + inner + "<br>"); inner++; } document.write("<br>"); document.write("<br>"); document.write("<br>");} LZ这里的public,private仅仅是作为标号名称而已,没有任何其他含义 like this怪自己不听讲,哈哈,书上有,忘了 lzd对于OOP的概念根深蒂固。有些概念在javascript是不一样的了。3楼的给出了答案,但没有分析原来,我们来分析一下:在MyUser()中,定义了private: heigth=163;这真的是私有变量吗,用调试工具你可发现,这个变量实际上是被放在了window下,而不是this的私有变量。也就是说任何不带var申明的变量都被放在了函数调用链的根对象上,这里就是window,而如果是var heigth=163;(像3楼那样),则heigth就放在了当前函数调用的上下文对象里。在调用youru.SetName()时,语句heigth=177应该怎么理解了?首先在this下找,结果没有,然后在当前函数调用空间里找,结果也没有,然后顺着函数调用对象链,一直找到window下,发现heigth申明了,因此修改heigth的值,由163变为177。调用youru.Say()时,寻找heigth的原理与youru.SetName()一样,实际上是找到了window下的height=177。为什么在MyUser()中,定义private: var heigth=163;情况不一样呢?要理解的话,必须掌握闭包的概念。不是一下能说明的,希望lz基线努力学习。总的来说,lz想要实现私有变量,应该加上var进行申明。 <script type="text/javascript">var height = 0;function MyUser(){ this.name="L.L.L"; this.year=22; this.Say=function(){ alert(this.name); alert(height); } height=163;//window.height here}function YourUser(){ this.Super=MyUser; this.Super(); this.SetName=function(){ this.name="J.J.J"; height=177;//window.height here }}function GetPersonValue(){ var youru=new YourUser(); youru.SetName(); youru.Say();//J.J.J和177}GetPersonValue();alert(height);//window.height has been changed</script> 可以參見:JavaScript作用域链scope chainhttp://www.v-ec.com/dh20156/article.asp?id=160JavaScript原型链prototype chainhttp://www.v-ec.com/dh20156/article.asp?id=157 最主要的还是关键字VAR的使用JScript的语法教程里面说在声明变量时忽略var要害字是完全合法的。但是事实经常又证实想当然的结果是不可靠的。 看看下面这几个例子的结果就知道问题了: <script language="javascript"> var var00 = 0; document.write(var00 + '<br>'); var var01 = 1; function foo() { document.write(var01); var var01 = 1; } foo(); </script> <script language="Javascript"> var00 = 0; document.write(var00 + '<br>'); var01 = 1; function foo() { document.write(var01); var01 = 1; } foo(); </script> <script language="javascript"> var00 = 0; document.write(var00 + '<br>'); var01 = 1; function foo() { document.write(var01); var var01 = 1; } foo(); </script> 这三个例子的执行结果分别是: Results#region Results No.1 0 undefined No.2 0 1 No.3 0 undefined #endregion 原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var要害字有没有都没有关系。而函数内的var要害字就很要害了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。 那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。 顺便说一下,重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。 <script type="text/javascript"> <!-- //这样写js的语句块更好一些:) --> </script> 我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有要害字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后. function get_global_var(___name) { return eval(___name); } function set_global_var(___name,___value) { eval(___name+"=___value"); } var aa=11; Test(); WScript.Echo(aa);//22 function Test() { var aa=33; WScript.Echo(get_global_var("aa"));//11 set_global_var("aa",22); WScript.Echo(get_global_var("aa"));//22 WScript.Echo(aa);//33 } 在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。 假如我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中假如要使用Global的变量,Lostinet给出的是一个方法。 不过最简单还是把global传入对象,这样定义Test: function Test(global) { // ... } box2d 中如何获取物体坐标 局域网的原理 问一个javascript里用request的问题 javascript 问题 列表及列表选项元素的疑惑! 数组函数 无聊,散分散代码... ◆◇我做的一个检测[合法]日期输入的函数,但有点错误!!请高手进来赐教!!3Q◆◇ 请问在js中有和vb的Split函数功能一样的函数吗?或者是代换方法。 关于div隐藏 初学者如何学习JavaScript javascript能不能判断onclick事件是程序激发的还是鼠标激发的??
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>新しいページ 1</title>
<script>
function MyUser()
{
public:
this.name="L.L.L";
this.year=22;
this.Say=function()
{
alert(this.name);
alert(this.heigth);
}
private:
this.heigth=163;
}
function YourUser()
{
EXTENDS:
this.Super=MyUser;
this.Super();
public:
this.SetName=function()
{
this.name="J.J.J";
heigth=177;
}
}
function GetPersonValue()
{
var youru=new YourUser();
youru.SetName();
youru.Say();
}
window.onload=GetPersonValue;
</script>
</head>
<body>
</body>
</html>
没见过这种写法,待高人解惑
public:
for(;;){
document.write("The outer is : " + outer + "<br>");
outer++;
var inner = 1;
private:
for(;;){
if(outer>5) break public;
if(inner>5) break private;
document.write("The inner is : " + inner + "<br>");
inner++;
}
document.write("<br>");
document.write("<br>");
document.write("<br>");
}
在MyUser()中,定义了
private:
heigth=163;这真的是私有变量吗,用调试工具你可发现,这个变量实际上是被放在了window下,而不是this的私有变量。也就是说任何不带var申明的变量都被放在了函数调用链的根对象上,这里就是window,而如果是var heigth=163;(像3楼那样),则heigth就放在了当前函数调用的上下文对象里。在调用youru.SetName()时,语句heigth=177应该怎么理解了?首先在this下找,结果没有,然后在当前函数调用空间里找,结果也没有,然后顺着函数调用对象链,一直找到window下,发现heigth申明了,因此修改heigth的值,由163变为177。调用youru.Say()时,寻找heigth的原理与youru.SetName()一样,实际上是找到了window下的height=177。
为什么在MyUser()中,定义
private:
var heigth=163;
情况不一样呢?要理解的话,必须掌握闭包的概念。不是一下能说明的,希望lz基线努力学习。总的来说,lz想要实现私有变量,应该加上var进行申明。
var height = 0;function MyUser(){
this.name="L.L.L";
this.year=22;
this.Say=function(){
alert(this.name);
alert(height);
}
height=163;//window.height here
}function YourUser(){
this.Super=MyUser;
this.Super();
this.SetName=function(){
this.name="J.J.J";
height=177;//window.height here
}
}function GetPersonValue(){
var youru=new YourUser();
youru.SetName();
youru.Say();//J.J.J和177
}GetPersonValue();alert(height);//window.height has been changed
</script>
JavaScript作用域链scope chain
http://www.v-ec.com/dh20156/article.asp?id=160JavaScript原型链prototype chain
http://www.v-ec.com/dh20156/article.asp?id=157
JScript的语法教程里面说在声明变量时忽略var要害字是完全合法的。但是事实经常又证实想当然的结果是不可靠的。
看看下面这几个例子的结果就知道问题了:
<script language="javascript">
var var00 = 0;
document.write(var00 + '<br>');
var var01 = 1;
function foo()
{
document.write(var01);
var var01 = 1;
}
foo();
</script>
<script language="Javascript">
var00 = 0;
document.write(var00 + '<br>');
var01 = 1;
function foo()
{
document.write(var01);
var01 = 1;
}
foo();
</script>
<script language="javascript">
var00 = 0;
document.write(var00 + '<br>');
var01 = 1;
function foo()
{
document.write(var01);
var var01 = 1;
}
foo();
</script>
这三个例子的执行结果分别是:
Results#region Results
No.1
0
undefined
No.2
0
1
No.3
0
undefined
#endregion
原来JavaScript的变量也是有作用域的,只是它非常的笼统,就分为全局变量和函数变量。在第二个例子中得到0和1,是因为所有的变量都是全局变量,而且那个语句块一共就定义了两个变量。而第一个第三的函数外全局变量,确实说明var要害字有没有都没有关系。而函数内的var要害字就很要害了,它说明第二个var01是函数内的变量,所以在初始化var01前输出自然就是'undefined'了。
那么函数里面是不是就屏蔽掉了全局的var01了呢?我们知道在C/C++可以使用::去访问全局变量,那么JavaScript可不可以呢?这里其实我们只要明白了全局变量到底是什么东西,就好弄了。原来全局变量都是动态添加到Window对象的实例window上的属性而以,所以我们只要在函数内用:document.write(window.var01);就可以取到其值1了。同时在这个上下文中,function内的this也是指向的window实例,我们也可以把引用写成:this.var01。
顺便说一下,重看JScript教程时,它说变量只能是[a-zA-Z_]+[a-zA-Z0-9_]*格式,可是'$'却也可以作为变量名字符,而且还可以用在开头,比如:$1234,更甚至于:$$$ 也是合法的变量名,faint。
<script type="text/javascript">
<!--
//这样写js的语句块更好一些:)
-->
</script>
我想知道是不是.在调用一个函数时,程序执行顺序会先检查函数内部变量中,有没有要害字var. 然后中再根据检查结果给不同的变量付予不同的作用域和变量值.因为我看到在这三个函数中,var01变量都是在输出语句之后.
function get_global_var(___name)
{
return eval(___name);
}
function set_global_var(___name,___value)
{
eval(___name+"=___value");
}
var aa=11;
Test();
WScript.Echo(aa);//22
function Test()
{
var aa=33;
WScript.Echo(get_global_var("aa"));//11
set_global_var("aa",22);
WScript.Echo(get_global_var("aa"));//22
WScript.Echo(aa);//33
}
在上面的例子中this从来就没有指过Test,而一直都是WScript的实例。
假如我们写一个语句:var test = new Test(); 这时Test里的this就是指的Test的一个实例了,这个实例中假如要使用Global的变量,Lostinet给出的是一个方法。
不过最简单还是把global传入对象,这样定义Test:
function Test(global)
{
// ...
}