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 相关文章推荐
JavaScript字符串String和Array操作的有趣方法
Dec 18 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
jquery右下角弹出提示框示例代码
Oct 08 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
Dec 05 Javascript
jQuery中的jQuery()方法用法分析
Dec 27 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
vue 自定义全局方法,在组件里面的使用介绍
Feb 28 Javascript
vue 设置路由的登录权限的方法
Jul 03 Javascript
vue强制刷新组件的方法示例
Feb 28 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 Javascript
vue 实现弹窗关闭后刷新效果
Apr 08 Vue.js
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以及MYSQL日期比较方法
2012/11/29 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
Node.js 深度调试方法解析
2020/07/28 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
python中执行shell命令的几个方法小结
2014/09/18 Python
理解Python中的With语句
2015/02/02 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python 实现淘宝秒杀的示例代码
2018/01/02 Python
Python3实现购物车功能
2018/04/18 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Python函数返回不定数量的值方法
2019/01/22 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
python实现批量命名照片
2020/06/18 Python
保荐人的岗位职责
2013/11/19 职场文书
市场专员岗位职责
2014/02/14 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
关于保护环境的建议书
2014/05/13 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL