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基础的动画教程,直观易懂
Jan 10 Javascript
jQuery为iframe的body添加click事件的实现代码
Apr 07 Javascript
js调用css属性写法
Sep 21 Javascript
实现51Map地图接口(示例代码)
Nov 22 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
Dec 31 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
JavaScript基于setTimeout实现计数的方法
May 08 Javascript
详解jQuery中的事件
Dec 14 Javascript
angular-cli修改端口号【angular2】
Apr 19 Javascript
Javascript实现的StopWatch功能示例
Jun 13 Javascript
JavaScript函数节流和函数去抖知识点学习
Jul 31 Javascript
详解javascript中var与ES6规范中let、const区别与用法
Jan 11 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实现批量查询清除一句话后门的代码
2008/01/20 PHP
PHP 遍历XP文件夹下所有文件
2008/11/27 PHP
php下将XML转换为数组
2010/01/01 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
2014/06/27 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
PHP 断点续传实例详解
2017/11/11 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
JS重要知识点小结
2011/11/06 Javascript
基于jquery打造的百分比动态色彩条插件
2012/09/19 Javascript
jquery 获取表单元素里面的值示例代码
2013/07/28 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
前端性能优化建议
2020/09/17 Javascript
Python enumerate遍历数组示例应用
2008/09/06 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
Flask框架配置与调试操作示例
2018/07/23 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
Python 占位符的使用方法详解
2019/07/10 Python
python实现按行分割文件
2019/07/22 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
Python reques接口测试框架实现代码
2020/07/28 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
乔迁之喜答谢词
2015/01/05 职场文书
golang使用map实现去除重复数组
2022/04/14 Golang
Python实现简单得递归下降Parser
2022/05/02 Python