Javascript面象对象成员、共享成员变量实验


Posted in Javascript onNovember 19, 2010

1)Javascript对象成员实验:

var f = function d() { 
this.a = "a";/*这句运行后不存在f.a也不存在d.a存在一个window.a*/ 
var b = "b";/*局部变量*/ 
}; 
var o = { ff: function () { 
var a = "a"; /*局部变量*/ 
this.b = "b"; /*这句运行后存在o.b*/ 
} 
}; 
function Man(){ 
this.age = 30; 
}; 
Man.prototype.sex = 1; 
Man.prototype.name = function () { 
}; 
debugger;/*第一处断点*/ 
f(); 
o.ff(); 
var m = new Man(); 
debugger; /*第二处断点*/

第一处断点时对象成员的存在情况:

Javascript面象对象成员、共享成员变量实验

第二处断点时对象成员的存在情况:

Javascript面象对象成员、共享成员变量实验

一句话:关于js函数:this指的是所在函数外最近一层的对象,而嵌套函数的内部函数内的this指的是window对象。

一句话:js的oo特性:使用this.成员方式定义对象的成员使用对象具有js特有的动态持性,类与对象实例有差异的,而.prototype.成员定义成员是经典的定义方式,类与对象实例是统一的。
2)Javascript对象共享性成员变量实验:

function Ghost(_name) { 
this.name = _name; 
this.age = 1000; 
} 
Ghost.prototype.setName = function (_name) { 
this.name = _name; 
} 
function Man(_name){ 
this.age = 30; 
this.ghost = new Ghost("实例变量" + _name); 
}; 
Man.prototype.ManGhost = new Ghost("共享变量"); 
var a = new Man("a"); 
var b = new Man("b"); 
var amg = a.ManGhost.setName("我只设置a的共享变量"); 
debugger; /*第一处断点*/ 
var ag = a.ghost; 
var bg = b.ghost; 
var bmg = b.ManGhost; 
debugger; /*第二处断点*/

运行到第一片断点:

Javascript面象对象成员、共享成员变量实验

简单变量与对象变量的差别

使用.prototype.定义的成员,如果该成员为简单变量则,每个对象实例都有一个各自的副本。(例如:Man.prototype.noObejctVar)

使用.prototype.定义的成员,如果该成员对象变量,则每个对象实例都共享同一个对象副本。(例如:Man.prototype.ManGhost)

为什么有这样的差别呢?单从ManGhost变量与noObjectVar变量它们都是使用.prototype.定义的成员是没有差别的,只是它们类型不同,表示它们访问和使用用它们的方式是不同的,只是ManGhost变量内存放的是new出来的对象,而noObjectVar变量内存放的是值(或某种值的引用),换句话说ManGhost存放的是对象的引用,通过这个引用可以操作这个对象,noObjectVar变量内存放也可是某种值引用,可是无法使用这个引用来操作它.

从另一个视角看

noObjectVar变量存放的是字串对象的引用.

a.noObjectVar="新字符串a";

这表示noObjectVar从原来的存放字符串对象引用,指向新字符串对象引用.(也可以说新的字符串对象覆盖原字符串对象)

a.ManGhost=new Ghost("a");

b.ManGhost=new Ghost("b");

这样a与b就不存在共享对象的问题了.不过这样就存在另一个问题.prototype.ManGhost时定义新建的对象就浪费了.不过这样使用.prototype.是错误的.

使用.prototype.定义成员函数及定义共享变量才是正确的用法.

使用javascript来正确的定义类请见:[技术备忘录]javascript来定义类的规范

Javascript 相关文章推荐
jquery实现居中弹出层代码
Aug 25 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
Sep 26 Javascript
JS数组去重与取重的示例代码
Jan 24 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
js实现双击图片放大单击缩小的方法
Feb 17 Javascript
jQuery中extend函数详解
Jul 13 Javascript
详解javascript数组去重问题
Nov 06 Javascript
浅谈JS运算符&&和|| 及其优先级
Aug 10 Javascript
requirejs + vue 项目搭建详解
Jun 16 Javascript
微信小程序实现简单表格
Feb 14 Javascript
openlayers实现地图弹窗
Sep 25 Javascript
angular4实现带搜索的下拉框
Mar 25 Javascript
js 创建快捷方式的代码(fso)
Nov 19 #Javascript
javascript 函数参数限制说明
Nov 19 #Javascript
Javascript的并行运算实现代码
Nov 19 #Javascript
js里的prototype使用示例
Nov 19 #Javascript
Google 静态地图API实现代码
Nov 19 #Javascript
javascript 窗口加载蒙板 内嵌网页内容
Nov 19 #Javascript
JS运行耗时操作的延时显示方法
Nov 19 #Javascript
You might like
实现 win2003 下 mysql 数据库每天自动备份
2006/12/06 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
php删除左端与右端空格的方法
2014/11/29 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
解决python爬虫中有中文的url问题
2018/05/11 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
python用Configobj模块读取配置文件
2020/09/26 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
祖国在我心中演讲稿200字
2014/08/28 职场文书
行政执法队伍作风整顿个人剖析材料
2014/10/11 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL