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 相关文章推荐
CheckBox 如何实现全选?
Jun 23 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
Dec 10 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
Sep 17 Javascript
Node.js文件操作方法汇总
Mar 22 Javascript
jquery获取所有选中的checkbox实现代码
May 26 Javascript
vue实现添加与删除图书功能
Oct 07 Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 Javascript
JavaScript实现连连看连线算法
Jan 05 Javascript
浅谈监听单选框radio改变事件(和layui中单选按钮改变事件)
Sep 10 Javascript
关于Vue中axios的封装实例详解
Oct 20 Javascript
js 闭包深入理解与实例分析
Mar 19 Javascript
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安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
客户端静态页面玩分页
2006/06/26 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
Node.js复制文件的方法示例
2016/12/29 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
python 删除非空文件夹的实例
2018/04/26 Python
pandas.DataFrame.to_json按行转json的方法
2018/06/05 Python
python实现求两个字符串的最长公共子串方法
2018/07/20 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python实现XML解析的方法解析
2019/11/16 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
python删除指定列或多列单个或多个内容实例
2020/06/28 Python
python 监控logcat关键字功能
2020/09/04 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
项目建议书格式
2014/03/12 职场文书
小学开学典礼主持词
2014/03/19 职场文书
毕业自我鉴定书
2014/03/24 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
无保留意见审计报告
2015/06/05 职场文书
少先大队干部竞选稿
2015/11/20 职场文书
送给火锅店的创意营销方案!
2019/07/08 职场文书
分析MySQL抛出异常的几种常见解决方式
2021/05/18 MySQL