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表格行换色的三种实现方法
Jun 27 Javascript
JS判断元素为数字的奇异写法分享
Aug 01 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
javaScript使用EL表达式的几种方式
May 27 Javascript
javascript实现网页字符定位的方法
Jul 14 Javascript
js时间戳转为日期格式的方法
Dec 28 Javascript
JS ES6中setTimeout函数的执行上下文示例
Apr 27 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
JS实现的贪吃蛇游戏完整实例
Jan 18 Javascript
详解小程序退出页面时清除定时器
Apr 28 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
May 27 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 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 获得汉字拼音首字母的函数
2009/08/01 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
自定义jQuery选项卡插件实例
2013/03/27 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
Python实现的简单hangman游戏实例
2015/06/28 Python
Python 中的 else详解
2016/04/23 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
2016/06/14 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
Python实现基于POS算法的区块链
2018/08/07 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python实现性能自动化测试竟然如此简单
2019/07/30 Python
python 内置函数汇总详解
2019/09/16 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
企业治理工作自我评价
2013/09/26 职场文书
临床医学专业个人的自我评价
2013/09/27 职场文书
化工机械应届生求职信
2013/11/04 职场文书
装饰活动策划方案
2014/02/11 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
房屋租赁协议书
2014/10/18 职场文书
行政答辩状范文
2015/05/21 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
正规欠条模板
2015/07/03 职场文书
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers