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 原型模式实现OOP的再研究
Apr 09 Javascript
JS实现超炫网页烟花动画效果的方法
Mar 02 Javascript
深入理解JavaScript中的箭头函数
Jul 28 Javascript
原生js页面滚动延迟加载图片
Dec 20 Javascript
jQuery实现只允许输入数字和小数点的方法
Mar 02 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
JavaScript判断用户名和密码不能为空的实现代码
May 16 Javascript
Javascript blur与click冲突解决办法
Jan 09 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
React BootStrap用户体验框架快速上手
Mar 06 Javascript
vue实现移动端项目多行文本溢出省略
Jul 29 Javascript
JS如何使用剪贴板操作Clipboard API
May 17 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调用.NET的WebService 简单实例
2015/03/27 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
javascript中Function类型详解
2015/04/28 Javascript
JavaScript获得url查询参数的方法
2015/07/02 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
jQuery ajax中使用confirm,确认是否删除的简单实例
2016/06/17 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
面包屑导航详解
2017/12/07 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
vue二选一tab栏切换新做法实现
2021/01/19 Vue.js
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
Python网络编程 Python套接字编程
2017/09/13 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
python如何实现代码检查
2019/06/28 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
python实现自动打卡的示例代码
2020/10/10 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
联想中国官方商城:Lenovo China
2017/10/18 全球购物
德国机车企业:FC-Moto
2017/10/27 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
.net软件工程师面试题
2015/03/31 面试题
商场消防管理制度
2014/01/12 职场文书
董事长秘书工作职责
2014/06/10 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
优秀员工推荐材料
2014/12/20 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
创业计划书之便利店
2019/09/05 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技