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 相关文章推荐
(仅IE下有效)关于checkbox 三态
May 12 Javascript
javascript concat数组累加 示例
Sep 03 Javascript
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 Javascript
JS动态改变表格边框宽度的方法
Mar 31 Javascript
AngularJS控制器继承自另一控制器
May 09 Javascript
深入理解jQuery之事件移除
Jun 02 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
Jun 22 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
Jul 18 Javascript
jQuery命名空间与闭包用法示例
Jan 12 Javascript
js轮播图无缝滚动效果
Jun 17 Javascript
vue实现新闻展示页的步骤详解
Apr 11 Javascript
Javascript var变量删除原理及实现
Aug 26 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
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
js压缩利器
2007/02/20 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
再谈javascript常见错误及解决方法
2016/09/16 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
python采集博客中上传的QQ截图文件
2014/07/18 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python将秒数转化为时间格式的实例
2018/09/16 Python
python监控nginx端口和进程状态
2019/09/06 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
迪奥美国官网:Dior美国
2019/12/07 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
优秀大学生的自我评价
2014/01/16 职场文书
早读迟到检讨书
2014/01/24 职场文书
《灯光》教学反思
2014/02/08 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
党员个人整改措施
2014/10/24 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
英文辞职信范文
2015/05/13 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
mysql 索引合并的使用
2021/08/30 MySQL