javascript实现面向对象类的功能书写技巧


Posted in Javascript onMarch 07, 2010

学过java,c#,vb的都知道类的概念,而类具有继承、封装、多态等功能。而javascript它不是面向对象语言,它是解释性语言。
但我们同样可以使用javascript来实现继承、多态。
javascript实现类,有多种方法。
方法一:构造方法。
代码

function coder(){ 
this.name = '小王'; 
this.job = '程序员'; 
this.coding = function () 
{ 
alert('我正在写代码'); 
} 
} 
var coder=new coder(); 
alert(coder.name); 
coder.coding();

方法二:工厂方法。
代码
function createCoderFactory(){ 
var obj=new Object(); 
obj.name = '小王'; 
obj.job = '程序员'; 
obj.coding = function (){ 
alert('我正在写代码'); 
}; 
return obj; 
} 
var coder = createCoderFactory(); 
alert(coder.name); 
coder.coding();

但工厂方法和构造方法都有着一个相同的缺点,就是每创建一个实例,都会实例化该类的每个函数。
方法三:原形链。
代码
function coder(){} 
coder.prototype.name = '小王'; 
coder.prototype.job = '程序员'; 
coder.prototype.coding = function(){ 
alert('我正在写代码'); 
}; 
var coder = new coder(); 
alert(coder.name); 
coder.coding();

注意:书上说:原型链有个缺点就是它所有属性都共享,只要一个实例改变其他的都会跟着改变。 测试如下:
var coder1 = new coder(); 
var coder2 = new coder(); 
alert(coder1.name); /*显示“小王”*/ 
coder2.name = '老王'; 
alert(coder1.name); /*这个显示“小王” 如果按书上说的应该是显示"老王"*/ 
alert(coder2.name); /*这个显示“老王”*/ 
alert(coder1.name);如果按书上说的应该是显示"老王",但这里显示的是“小王”,所以书上出错了。

方法四:混合方式。
以上三种都有着各自的缺点,所以我们要加以改进。
function coder(){ 
this.name = '小王'; 
this.job = '程序员'; 
} 
coder.prototype.coding = function(){ 
alert('我正在写代码'); 
};

方法五:动态原链。
要解决前三种的缺点,还有一种方法。
代码
function coder(){ 
this.name = '小王'; 
this.job = '程序员'; 
if (typeof(coder._init) == 'undefined'){ 
this.coding = function () 
{ 
alert('我正在写代码'); 
}; 
this._init = true; 
} 
}

这个方法呢,当第一次使用时,由于_init没初始化,就会执行以下的代码,实例化coding函数。以后就不会再执行,这样就只实例化函数一次。
Javascript 相关文章推荐
js变量作用域及可访问性的探讨
Nov 23 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
Jan 17 Javascript
js控制台输出的方法(详解)
Nov 26 Javascript
jsTree使用记录实例
Dec 01 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
Jul 18 jQuery
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
JavaScript中Object基础内部方法图
Feb 05 Javascript
Angular4 组件通讯方法大全(推荐)
Jul 12 Javascript
javascrit中undefined和null的区别详解
Apr 07 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
Oct 30 Javascript
Vue.js watch监视属性知识点总结
Nov 11 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 #Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
Mar 05 #Javascript
Jquery Validation插件防止重复提交表单的解决方法
Mar 05 #Javascript
javascript下判断一个元素是否存在的代码
Mar 05 #Javascript
ExtJs扩展之GroupPropertyGrid代码
Mar 05 #Javascript
js 获取服务器控件值的代码
Mar 05 #Javascript
jquery checkbox全选、取消全选实现代码
Mar 05 #Javascript
You might like
php根据年月获取季度的方法
2014/03/31 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
jQuery Form 页面表单提交的小例子
2013/11/15 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
js实现多个标题吸顶效果
2020/01/08 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
vue集成一个支持图片缩放拖拽的富文本编辑器
2021/01/29 Vue.js
Python通过select实现异步IO的方法
2015/06/04 Python
python简单实现计算过期时间的方法
2015/06/09 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
对Python3中列表乘以某一个数的示例详解
2019/07/20 Python
python matplotlib折线图样式实现过程
2019/11/04 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
2020/02/21 Python
Python实现动态循环输出文字功能
2020/05/07 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
外语专业毕业生自我评价分享
2013/10/05 职场文书
升旗仪式主持词
2014/03/19 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server