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 相关文章推荐
利用javascript中的call实现继承
Jan 22 Javascript
解决jquery1.9不支持browser对象的问题
Nov 13 Javascript
jquery将一个表单序列化为一个对象的方法
Dec 02 Javascript
原生javascript实现的ajax异步封装功能示例
Nov 03 Javascript
详解Node.js:events事件模块
Nov 24 Javascript
巧用Javascript的逻辑运算符
Dec 02 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
Jan 04 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 Javascript
Vue 2.0入门基础知识之内部指令详解
Oct 15 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
Mar 07 Javascript
javascript单张多张图无缝滚动实例代码
May 10 Javascript
node.js如何操作MySQL数据库
Oct 29 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
php cache类代码(php数据缓存类)
2010/04/15 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
js实现每日自动换一张图片的方法
2015/05/04 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python中一行和多行import模块问题
2018/04/01 Python
python sleep和wait对比总结
2021/02/03 Python
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
介绍一下Make? 为什么使用make
2016/07/31 面试题
汽车销售求职自荐信
2013/10/01 职场文书
质检部岗位职责
2013/11/11 职场文书
合伙经营协议书范本
2014/09/13 职场文书
《自己去吧》教学反思
2016/02/16 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python