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 相关文章推荐
jQuery 全选效果实现代码
Mar 23 Javascript
Javascript 中 null、NaN和undefined的区别总结
Apr 10 Javascript
APP中javascript+css3实现下拉刷新效果
Jan 27 Javascript
jQuery Dialog对话框事件用法实例分析
May 10 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单的实现代码
Jun 23 Javascript
详解javascript表单的Ajax提交插件的使用
Dec 29 Javascript
基于node.js依赖express解析post请求四种数据格式
Feb 13 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
Dec 05 Javascript
vue中动态绑定表单元素的属性方法
Feb 23 Javascript
浅谈node.js 命令行工具(cli)
May 10 Javascript
es6数组之扩展运算符操作实例分析
Apr 25 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
Apr 02 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函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
WordPress JQuery处理沙发头像
2009/06/22 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
无阻塞加载js,防止因js加载不了影响页面显示的问题
2016/12/18 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
vue实现搜索功能
2019/05/28 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
行政助理工作职责范本
2014/03/04 职场文书
法律六进活动方案
2014/03/13 职场文书
超市活动计划书
2014/04/24 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
反邪教观后感
2015/06/11 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书