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 相关文章推荐
js 未结束的字符串常量错误解决方法
Jun 13 Javascript
javascript中动态加载js文件多种解决办法总结
Nov 15 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
Aug 27 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
Feb 23 Javascript
javacript获取当前屏幕大小
Jun 04 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
Aug 26 Javascript
js上下视差滚动简单实现代码
Mar 07 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
使用Vue实现调用接口加载页面初始数据
Oct 28 Javascript
JS删除数组指定值常用方法详解
Jun 04 Javascript
用几道面试题来看JavaScript执行机制
Apr 30 Javascript
解决vue中provide inject的响应式监听
Apr 19 Vue.js
使用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源码之explode使用说明
2011/08/05 PHP
PHP版QQ互联OAuth示例代码分享
2015/07/05 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
图片完美缩放
2006/09/07 Javascript
Mootools 1.2教程 类(一)
2009/09/15 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
js重写方法的简单实现
2016/07/10 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
对angular 实时更新模板视图的方法$apply详解
2018/10/09 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
深入理解Django的自定义过滤器
2017/10/17 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
python找出完数的方法
2018/11/12 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
Python格式化字符串f-string概览(小结)
2019/06/18 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
电焊工工作岗位职责
2014/02/06 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
小学大队长竞选稿
2015/11/20 职场文书
mysql知识点整理
2021/04/05 MySQL