js面向对象的写法


Posted in Javascript onFebruary 19, 2016

本文归纳了js面向对象的几种常见写法,分享给大家供大家参考,具体内容如下
1.工厂方式

var Circle = function() {
 var obj = new Object();
 obj.PI = 3.14159;
 
 obj.area = function( r ) {
  return this.PI * r * r;
 }
 return obj;
}

var c = new Circle();
alert( c.area( 1.0 ) );

2.比较正规的写法

function Circle(r) {
  this.r = r;
}
Circle.PI = 3.14159;
Circle.prototype.area = function() {
 return Circle.PI * this.r * this.r;
}

var c = new Circle(1.0); 
alert(c.area());

3.json写法

var Circle={
 "PI":3.14159,
 "area":function(r){
   return this.PI * r * r;
  }
};
alert( Circle.area(1.0) );

4.有点变化,但是实质和第一种一样

var Circle=function(r){
  this.r=r;
}
Circle.PI = 3.14159; 
Circle.prototype={
 area:function(){
  return this.r*this.r*Circle.PI;
 }
}
var obj=new Circle(1.0);
alert(obj.area()

Circle.PI = 3.14159; 能够放入属性中写成this.PI=3.14159;

常用为第一种和第三种,第三种写法的扩展小实例

var show={
  btn:$('.div1'),
  init:function(){
   var that=this;
   alert(this);
   this.btn.click(function(){
     that.change();
     alert(this);
    })
   
  },
  change:function(){
   this.btn.css({'background':'green'});

  }
 }
 show.init();

需要注意的是this的指向问题,下面是关于this的一点点介绍,希望对大家有帮助。
一开始采用动态原型方法在js中创建自定义的对象,this也用着很顺的。
这种方法中对于在对象内部对变量的创建和使用都是用"this."开头的。
比如:对象ContactModel,有三个属性,crtnewFriendListLen,crtNewFriendList,crtFindedUserID
四个方法requestContactList(),requestNewfriendList(),requestFindUser(),requestAddContact()
在这个变量内部如要访问自己的属性,都要带上"this."

var contactModel;
...
contactModel = new ContactModel();
function ContactModel()
{
 // this.contactList;
 this.crtnewFriendListLen;
 this.crtNewFriendList;
 this.crtFindedUserID = "-1";
 
 if(typeof ContactModel._initialized == "undefined")
 {
  ContactModel.prototype.requestContactList = function()
  {
   
  }
  
  ContactModel.prototype.requestNewfriendList = function()
  {
   
  }
 
  ContactModel.prototype.requestFindUser = function(userID)
  {
   $.getJSON(mainUrl + "User/getuserinfo",{"uid":userID},function(resultObj)
   {




 // this.crtFindedUserID = userID
    contactModel.crtFindedUserID = userID;
    uiManager.contectAddPage.receiveFindUserResult(resultObj);
   });
  }
  
  ContactModel.prototype.requestAddContact = function(remark)
  {
   alert(this.crtFindedUserID);
    
  }
  
  ContactModel._initialized = true;
 };
}

但这时问题出现了,在requestFindUser ()内,若用this.crtFindedUserID来存储服务端传来的数值,那么在之后此对象被调用了requestAddContact()方法后,是拿不到crtFindedUserID这个值的,alert里显示的依然会是初始值-1,问题就出在$.getJSON()的回调方法内,此时的this指的不是ContactModel的实例,而是此方法体,所以这里的解决办法就是在这个回调方法内拿到ContectModel的实例,然后给这个实例的属性crtFindedUserID赋值。
在对象内部对视图组件的监听回调方法里,this指向的也不是对象本身,同样还是这个被回调的方法体,这时若要访问对象本身的属性,就要拿到此对象的实例来访问,而不是用this.
下面是一段JS面向对象的标准写法

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>新建网页 1</title> 
<mce:script type=text/javascript><!-- 
 var person=function(name,age){//定义对象构造方法 
  this.name=name; 
  this.age=age; 
 } 
 person.prototype={ //封装方法 
  getName:function(){ 
   alert(this.name); 
  }, 
  getAge:function(){ 
   alert(this.age); 
  } 
 } 
 
 function test(){//声明调用 
  var man=new person('jack',12); 
  man.getName() 
  man.getAge() 
 } 
  
 var test2 ={ //类似静态方法 调用直接:test2.te();即可 
  te:function(){ 
   alert(); 
  }, 
  te1:function(){ 
   alert(); 
  } 
 } 
// --></mce:script> 
</head> 
<body> 
 <input type=button onclick="test()"/> 
</body> 
</html>

希望本文所述对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
js实现字符串的16进制编码不加密
Apr 25 Javascript
jquery实现简单的轮换出现效果实例
Jul 23 Javascript
Javascript实现快速排序(Quicksort)的算法详解
Sep 06 Javascript
JavaScript自定义文本框光标
Mar 05 Javascript
JavaScript运动框架 链式运动到完美运动(五)
May 18 Javascript
BootStrap Select清除选中的状态恢复默认状态
Jun 20 Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 Javascript
ES6学习笔记之let与const用法实例分析
Jan 22 Javascript
React.js组件实现拖拽排序组件功能过程解析
Apr 27 Javascript
关于vue 项目中浏览器跨域的配置问题
Nov 10 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
Feb 19 #Javascript
js下将金额数字每三位一逗号分隔
Feb 19 #Javascript
javascript下使用Promise封装FileReader
Feb 19 #Javascript
javascript每日必学之循环
Feb 19 #Javascript
jQuery实现简单的DIV拖动效果
Feb 19 #Javascript
JavaScript深度复制(deep clone)的实现方法
Feb 19 #Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
Feb 19 #Javascript
You might like
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
从手册去理解分析PHP session机制
2011/07/17 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
跟我学Laravel之路由
2014/10/15 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
PHP实现八皇后算法
2019/05/06 PHP
Document 对象的常用方法
2009/07/31 Javascript
jquery中this的使用说明
2010/09/06 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
详解Angular2表单-模板驱动的表单(Template-Driven Forms)
2017/08/04 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
2018/01/20 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
pyshp创建shp点文件的方法
2018/12/31 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
基于python代码批量处理图片resize
2020/06/04 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
GWebs公司笔试题
2012/05/04 面试题
财务管理专业应届毕业生求职信
2013/09/22 职场文书
小学教师师德反思
2014/02/03 职场文书
工作作风承诺书
2014/08/30 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书