JS模拟面向对象全解(一、类型及传递)


Posted in Javascript onJuly 13, 2011

可是,没有类,何来面向对象一说?没有关系,可以模拟。而且这一套方法已经成为公认的JS实现面向对象的方法。
另外,JS内的东西完全开发,也就不存在成员的什么private、protected作用域。
下面切入正题。

一、类型

//从基础开始,省的后面看着吃力

1、类型的区别
基本数据类型和对象类型不是一回事。
a、基本类型只是一个值,没有任何行为;而对象类型有自己的行为。
b、基本类型是值类型,仅表示一个值;对象类型则拥有许多复杂的东西。
c、基本类型传递时传值,对象类型传递时传址。
另外,文本非常特殊,JS里面有两种文本类型——一种基本数据类型,一种对象类型。 举个例子:
var str="The End";//这样是基本数据类型,传递方式就是传值
var str2=new string("The End");//这就不同,有了new这个为对象开辟内存空间的标识符,对应的变量就会成为对象类型,传递时即传址
简单点说: a、直接用字面量赋值的变量,如var a=1;var b="a";var c=true;,都是基本数据类型(常用的有:数值、文本、布尔)
b、用new赋值的变量,如var a=new Object();var b=new string();,都是对象类型(JS有许多对象,算是精简的面向对象语言) 请注意:基本数据类型也可以new,但是很少有那种用法。因此上述区分办法不完全适用所有情况,请加以自行判断。

2、参数传递方式 这一节主要来区分传址、传值。 仍然拿例子来说事:

function changeVar(varible){ 

varible=5; 


alert(varible);//提示5 
} 
var a=3; 
alert(a);//提示3 
changeVar(a);//该函数内部有改变参数的代码 alert(a);//仍然提示3

根据上例可以发现,函数虽然改变了参数,但是并没有改变参数所代表的传递过去变量。这是传值。在调用changeVar时,JS重新拷贝了一份你传递的变量作为参数,所以,在changeVar内部操作的参数实际上是你传递的变量的副本,而非本身。 传递的其实是变量的值,而非变量本身。这叫做传值。
function changeVar(varible){ 

varible.x=5; 


alert(varible.x);//提示5 
} 
var a=new Object; 
a.x=3 alert(a.x);//提示3 
changeVar(a);//该函数内部有改变参数的代码 
alert(a.x);//提示5

上例改成使用Object对象了。发现,changeVar之后,原来的变量的对应属性也发生改变,函数内部就是操作的传递的变量本身。 传址就是这个道理,把你给定的变量的内存地址传递过去,函数内部改变的其实就是你传递的变量。因为操作的都是在统一内存地址的东西。

但是,一定注意这个“但是”!JS的传址还是有些特别之处! JS在传递对象类型时,大概也拷贝了一份相应类型的对象,但是副本对象的所有属性、函数都是原对象的属性、函数。 也许就是,属性传址而对象不传址。 这个特点可以证明。 代码如下:

function changeVar(varible){ 

varible=new Object(); 


varible.x=5; 


alert(varible.x);//提示5 
} 
var a=new Object; 
a.x=3 alert(a.x);//提示3 
changeVar(a);//该函数内部有改变参数的代码 
alert(a.x);//提示3

当你改变了参数代表的对象时,并未改变的了你传递的变量代表的对象。但前面说过,可以通过函数内对参数对象的属性操作改变原变量代表对象的属性。这结合起来就可以证明,JS在传递对象类型时,也拷贝了一份相应类型的对象,但是副本对象的所有属性、函数都是原对象的属性、函数。
Javascript 相关文章推荐
html读出文本文件内容
Jan 22 Javascript
JQuery 实现的页面滚动时浮动窗口控件
Jul 10 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
May 30 Javascript
基于jquery的9行js轻松实现tab控件示例
Oct 12 Javascript
浅谈Sublime Text 3运行JavaScript控制台
Jun 06 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
Oct 25 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
Jul 31 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
Aug 14 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
Mint UI组件库CheckList使用及踩坑总结
Dec 20 Javascript
新手快速上手webpack4打包工具的使用详解
Jan 28 Javascript
Webpack中loader打包各种文件的方法实例
Sep 03 Javascript
一些实用的jQuery代码片段收集
Jul 12 #Javascript
formValidator3.3的ajaxValidator一些异常分析
Jul 12 #Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 #Javascript
JQuery获取当前屏幕的高度宽度的实现代码
Jul 12 #Javascript
Jquery进度条插件 Progress Bar小问题解决
Jul 12 #Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
Jul 11 #Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
Jul 11 #Javascript
You might like
在WIN98下以apache模块方式安装php
2006/10/09 PHP
PHP字符串函数系列之nl2br(),在字符串中的每个新行 (\n) 之前插入 HTML 换行符br
2011/11/10 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
js实现数字滚动特效
2019/12/16 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
Tensorflow中的dropout的使用方法
2020/03/13 Python
Python configparser模块应用过程解析
2020/08/14 Python
python属于哪种语言
2020/08/16 Python
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
中软Java笔试题
2012/11/11 面试题
行政经理岗位职责
2013/11/09 职场文书
经典演讲稿范文
2013/12/30 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
电子商务专业求职信
2014/03/08 职场文书
推荐信怎么写
2014/05/09 职场文书
中国梦团日活动总结
2014/07/07 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers