JavaScript的面向对象(一)


Posted in Javascript onNovember 09, 2006

一。传统的基于原型(Prototype)的做法
确切地说Javascrīpt的“类”在严格意义上来讲并不能算真正的类,从其声明的对象到类(估切这么说)有这样一个关系:
Instance.__proto__=InstanceClass.prototype(ie不支持)
以上说明:实例的属性(__proto__)等于类的prototpye,我们可以看出,实例的"__proto__"正好巧接在类的"prototype"上,通过原型链(prototype)来查找其方法并扩展,我们会发现其方法(Method)与其属性(Property)都是Public(当然你也可以用Private,即不用this),而prototype其实就是一对象,用来记录方法做为一个集合
假设我们声明一个类A,可以如此
function A(){
this.className="ClassA";   //添加Public属性,正确来说类名应该是Private的
}
//添加一方法
A.prototype.getClassName=function(){
return this.className;          //this指代A,而不是prototype
}
//声明一对象
var AObj=new A();
alert(AObj.__proto__==A.prototype);     //ie下无效,ff下为true,说明上面的验证是正确的
//我们来看看对象属性
/*
由于用了this,className即为Public,即可以随意修改或读取
如果要保护起来,就要用到Private,那么可以去掉其this前缀,做为保护
读的时候用一公开方法,即prototype下的方法:
A.prototype.getClassName=function(){
return className;                    //行不通,不存在,className是undefined
}
在这儿也只能约定一下,给className加上this,不要去直接去访问。在这一点上,的确不如第二种方法,稍
后会说明
*/
关于"prototype"
由于Javascrīpt并没有在系统内部并未使用过“继承”(很大可能),所以class下的prototype得到的全是 
顶层Object,后期在继承的时候,我们可以看到这样的一个式子:
child.prototype=new parent();
继承两字带引号的意思是说就算有继承也并非真正意义上的继承,也只是通过prototype巧接得到。
用实例扩展一个方法到类,这儿不得不提及__proto__这个属性

<scrīpt LANGUAGE="Javascrīpt">  
<!--  
function abc(){  
 var ōwner=this;  
 owner.k="pp";  
 owner.abc=function(){  
 }  
}  
abc.prototype.def=function(){  
}  
var s=new abc();  
for(var t in abc.prototype){  
 alert("prototype指向:"+t+"="+abc.prototype[t]);  
}  
for(var t in s.__proto__){  
 alert("__proto__指向:"+t+"="+s.__proto__[t]);  
}  
//-->  
</scrīpt> 
在ff下我看可以看到实例名.__proto__=类.prototype,现在通过实例扩展一个方法,这儿在实际应用当中并不推荐这样做,下例:
s.__proto__.hjk=function(){
  return "hjk";
}
alert(s.hjk());
for(var t in abc.prototype){
 alert("prototype指向:"+t+"="+abc.prototype[t]);
}
这下应该明白了吧。
Javascript 相关文章推荐
Tips 带三角可关闭的文字提示
Oct 06 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
Aug 29 Javascript
setTimeout自动触发一个js的方法
Jan 15 Javascript
jquery的live使用注意事项
Feb 18 Javascript
javascript中返回顶部按钮的实现
May 05 Javascript
javascript给span标签赋值的方法
Nov 26 Javascript
Node.js中process模块常用的属性和方法
Dec 13 Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
Vue 滚动行为的具体使用方法
Sep 13 Javascript
详解小程序缓存插件(mrc)
Aug 17 Javascript
javscript 数组扁平化的实现
Feb 03 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
Jun 02 jQuery
JavaScript的面向对象(二)
Nov 09 #Javascript
利用javascript查看html源文件
Nov 08 #Javascript
用javascript获得地址栏参数的两种方法
Nov 08 #Javascript
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
Nov 07 #Javascript
Ucren Virtual Desktop V2.0
Nov 07 #Javascript
非常不错的一个javascript 类
Nov 07 #Javascript
不错的一个日期输入 动态
Nov 06 #Javascript
You might like
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
JS查看对象功能代码
2008/04/25 Javascript
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python调用百度语音识别api
2018/08/30 Python
pyttsx3实现中文文字转语音的方法
2018/12/24 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
python设置环境变量的作用整理
2020/02/17 Python
CSS3中的注音对齐属性ruby-align用法指南
2016/07/01 HTML / CSS
CSS3 box-sizing属性
2009/04/17 HTML / CSS
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
生产副总岗位职责
2013/11/28 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
2014年党员整改措施
2014/10/24 职场文书
2014年体育工作总结
2014/11/24 职场文书
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
Spring Data JPA框架持久化存储数据到数据库
2022/04/28 Java/Android