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 打印页面代码
Mar 24 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
Nov 12 Javascript
javascript中的if语句使用介绍
Nov 20 Javascript
js中同步与异步处理的方法和区别总结
Dec 25 Javascript
js中一维数组和二位数组中的几个问题示例说明
Jul 17 Javascript
JavaScript中原型和原型链详解
Feb 11 Javascript
vue-hook-form使用详解
Apr 07 Javascript
Angular 4中如何显示内容的CSS样式示例代码
Nov 06 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
Sep 14 Javascript
react-router 路由切换动画的实现示例
Dec 03 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
Nov 14 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
Jun 22 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使用websocket示例详解
2014/03/12 PHP
初识php MVC
2014/09/10 PHP
php导出CSV抽象类实例
2014/09/24 PHP
php验证码实现代码(3种)
2015/09/07 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
js倒计时小程序
2013/11/05 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
MockJs结合json-server模拟后台数据
2020/08/26 Javascript
Vue实现Layui的集成方法步骤
2020/04/10 Javascript
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
全面理解Python中self的用法
2016/06/04 Python
Python 查看文件的编码格式方法
2017/12/21 Python
Python决策树分类算法学习
2017/12/22 Python
python截取两个单词之间的内容方法
2018/12/25 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
人事任命书范文
2014/06/04 职场文书
出国导师推荐信
2015/03/25 职场文书