当前位置:
代码迷
>>
JavaScript
>> Javascript种,prototype研究
详细解决方案
Javascript种,prototype研究
热度:
186
发布时间:
2012-06-30 17:20:12.0
Javascript类,prototype研究。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试Javascript类</title> </head> <body> <div id="dbg"> </div> <script type="text/javascript"> function p(str) { if(str.indexOf('err')!=-1) str = '<font color="#ff0000">'+str+'</font>'; str = str.replace(/(pro_fun)/g,'<font color="#ff00ff">$1</font>'); str = str.replace(/(pub_fun)/g,'<font color="#0000ff">$1</font>'); g('dbg').innerHTML = g('dbg').innerHTML+'<br />'+str; } function g(id) { return document.getElementById(id); } function f1() { var pri_var = 'pri_var'; this.pub_var = 'pub_var'; this.pub_fun = function() { try{ p('pub_fun->pri_var:'+pri_var); }catch(e){ p('pub_fun->pri_var(err):'+e); } try{ p('pub_fun->pub_var:'+this.pub_var); }catch(e){ p('pub_fun->pub_var(err):'+e); } //--------------------------------------------- try{ p('pub_fun->pro_var:'+this.pro_var); }catch(e){ p('pub_fun->pro_var(err):'+e); } //--------------------------------------------- try{ this.pro_fun(); }catch(e){ p('cls.pub_fun->pro_fun(err):'+e); } } this.pub_chgv=function(){//注意下面有一个f1.prototype.pub_chgv,而被认可的是这个函数,ie9 ff this.pub_var = 'pub_var->pub_chgv'; this.pro_var = 'pro_var->pub_chgv'; p('pub_chgv->pub_var: '+this.pub_var); p('pub_chgv->pro_var: '+this.pro_var); } } f1.prototype.pro_var = 'pro_var'; f1.prototype.pro_fun = function(){ try{ p('pro_fun->pri_var:'+pri_var); }catch(e){ p('pro_fun->pri_var(err):'+e); } try{ p('pro_fun->pri_var:'+this.pri_var); }catch(e){ p('pro_fun->pri_var(err):'+e); } try{ p('pro_fun->pub_var:'+this.pub_var); }catch(e){ p('pro_fun->pub_var(err):'+e); } //--------------------------------------------- try{ p('pro_fun->pro_var:'+this.pro_var); }catch(e){ p('pro_fun->pro_var(err):'+e); } } f1.prototype.pub_chgv=function(){ this.pub_var = 'pub_var->pro_chgv'; this.pro_var = 'pro_var->pro_chgv'; p('pro_chgv->pub_var: '+this.pub_var); p('pro_chgv->pro_var: '+this.pro_var); } f1.prototype.pro_getv=function(){ p('<hr>pro_getv->pub_var: '+this.pub_var); p('pro_getv->pro_var: '+this.pro_var); p('pro_getv->pro_var: '+f1.pro_var+' <-- 这说明:将prototype增加的属性或者方法称为静态的方法或者属性并不正确,因为它不能不实例化直接调用'); } var CLA = new f1(); var clb = new f1(); CLA.pub_fun(); try{ f1.pro_getv(); }catch(e){ p('f1.pro_getv(err):'+e+' <-- 这说明:将prototype增加的属性或者方法称为静态的方法或者属性并不正确,因为它不能不实例化直接调用'); } //一个实例改变私有变量或者prototype变量,不会影响其它的实例的值(改变自己的prototype属性会复制一份给自己,根据作用于原理(从自身向上查),自己有一个复制之后,就不再受prototype影响) CLA.pub_chgv(); clb.pro_getv(); //--------------------------------------------- //一个实例改变增加或者改变方法属性,都不会影响其它实例 CLA.pro_getv=function(){ p('<hr><font color="#00ffff">new by instance</font> pro_getv->pub_var: '+this.pub_var); p('<font color="#00ffff">new by instance</font> pro_getv->pro_var: '+this.pro_var+' <--- 注意pro_var在前面通过CLA.pub_chgv()改变了值,它就不再是引用prototype的值了,因此它不受prototype的影响了'); p('<font color="#00ffff">new by instance</font> pro_getv->pro_var: '+f1.pro_var); } clb.pro_getv(); //--------------------------------------------- //通过原始类的.prototype去改变属性或者方法,会使所有的未通过实例自身改变属性或者方法的实例的也变化 f1.prototype.pro_var = 'pro_var changed'; f1.prototype.pro_getv=function(){ p('<hr>new 1 pro_getv->pub_var: '+this.pub_var); p('new 1 pro_getv->pro_var: '+this.pro_var); p('new 1 pro_getv->pro_var: '+f1.pro_var); } clb.pro_getv(); //CLA 通过实例自身改变过pro_getv方法,它的方法pro_getv没有被prototype.pro_getv改变,但可能是存在着两个pro_getv,一个在CLA下,一个在f1.prototype下,当CLA(实例)下找不到,就会去原型(类定义)去找 //CLA.pub_chgv改变了CLA的pro_var,此时无法通过prototype去修改CLA的pro_var CLA.pro_getv(); //--------------------------------------------- /* 总结: 1 类(function)声明时定义的变量: a、 var 定义的,只有类声明内定义的函数(this.fun=function(){}或者function fun(){})能够访问,多个实例之间相互不影响,也不能prototype改变 b、 this 定义的变量,prototype定义的函数或者类声明内定义的函数(this.fun=function(){}确定可以,function func(){}未实验)都可以访问(使用this.var_name访问);多个实例之间相互不影响,也不能prototype改变 2 prototype定义的变量或者方法,新建实例时只是建立了一个引用,如果实例改变变量或者方法,那么方法或者变量将指向新的值,因此,方法或者变量就不再随着prototype变化而变化 */ </script> </body> </html>
pro = prototype
pri = private
pub = public
查看全文
相关解决方案
javascript ie6兼容的有关问题
javascript window open在ie中设立不起作用,求解决
spring @Scope("prototype")注解更新有关问题,寻求帮助
javascript 字符串拼接效率有关问题
JavaScript 自动生成图片并合并有关问题
不走"<script type='text/javascript'>"标签咋回事
<script type="javascript/text">的有关问题
用servlet+jsp+javascript+jdbc做个简单的办公自动化系统流程,该如何解决
怎么打开 javascript:SetData(2010,5,10)
javaScript = == ===区别,该怎么解决
javascript 怎么验证name=xx.xx的radio表单
form action 和 javascript 的提交問題解决方法
javascript,该怎么处理
javascript,该如何处理
关于下载Nokia Prototype SDK4.0的有关问题
javascript 选中文字 但是保存样式 标签
新人求问,J2EE方向,html,css,javascript,vml要学到什么程度?解决思路
javascript 请求servlet兑现将函数中定义的变量作为参数
javascript 不懂,该如何处理
javascript 不懂解决方法
JavaScript 大局函数求实例,高分求
javaScript 里面 如何知道Object 对象的长度
javascript 函数调用有什么有关问题,请
javascript 中文本框中数字如何比较
javascript IE通过,火狐,google浏览器不过解决思路
javascript rsa加密/java使用Cipher.getInstance("RSA/ECB/PKCS1Padding")解密,该如何处理
IE javascript start()函数解决方案
关于RTMP 播放器(DELPHI C# FLASH JAVASCRIPT)解决思路
Chrome Javascript Click 事件,该如何解决
javascript 实出_blank跳转到新标签页有关问题