写了很久JS,还以为这段代码可以正常输出,谁知道输出超乎我的形象:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function MSG(a,b,c,d){
this.a=a;
this.b=b;
this.c=c;
this.d=d;
this.e="喜欢";
var that=this; //方便私有函数haha()访问
this.say=function(){
console.log(haha());
}
this.ca=function(){
return that.c+this.e+this.d;
}
function haha(){
return this.a+",今年"+this.b+"岁;";
// return this.a+",今年"+this.b+"岁;"+this.ca();
// return that.a+",今年"+that.b+"岁;"+that.ca();
}
}
var my=new MSG('张三','25','男','美女');
my.say();
</script>
</head>
<body>
</body>
</html>

  

以下这段代码居然报错,呜呜呜呜呜。。。。。。。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function MSG(a,b,c,d){
this.a=a;
this.b=b;
this.c=c;
this.d=d;
this.e="喜欢";
var that=this; //方便私有函数haha()访问
this.say=function(){
console.log(haha());
}
this.ca=function(){
return that.c+this.e+this.d;
}
function haha(){
// return this.a+",今年"+this.b+"岁;";
return this.a+",今年"+this.b+"岁;"+this.ca();
// return that.a+",今年"+that.b+"岁;"+that.ca();
}
}
var my=new MSG('张三','25','男','美女');
my.say();
</script>
</head>
<body>
</body>
</html>

  

修改以上的代码,让that=this;此时that和this指向同一位置,就可以啦。。。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function MSG(a,b,c,d){
this.a=a;
this.b=b;
this.c=c;
this.d=d;
this.e="喜欢";
var that=this; //方便私有函数haha()访问
this.say=function(){
console.log(haha());
}
this.ca=function(){
return that.c+this.e+this.d; //this==that
}
function haha(){
// return this.a+",今年"+this.b+"岁;";
// return this.a+",今年"+this.b+"岁;"+this.ca();
return that.a+",今年"+that.b+"岁;"+that.ca();
}
}
var my=new MSG('张三','25','男','美女');
my.say();
</script>
</head>
<body>
</body>
</html>

  

总结:

私有变量】 在对象内部使用'var'关键字来声明,而且它只能被私有函数和特权方法访问。 
【私有方法】 在对象的构造函数里声明(或者是通过varfunctionName=function(){...}来定义),
它能被特权方法调用(包括对象的构造方法)和私有方法调用,私有函数只能访问私有的方法和属性。 
【特权方法】通过this.methodName=function(){...}来声明而且可能被对象外部的代码调用。
它可以使用:this.特权函数() 方式来调用特权函数,使用 :私有函数()方式来调用私有函数。

【公共属性】 通过this.variableName来定义而且在对象外部是可以读写的。不能被私有函数所调用。 
【公共方法】 通过ClassName.prototype.methodName=function(){...}来定义可以从对象外部来调用。 
【原型属性】 通过ClassName.prototype.propertyName=someValue 来定义。 
【静态属性】 通过ClassName.propertyName=someValue 来定义。
【静态方法】 通过ClassName.funName=function(){...} 来定义。

一段js的思考的更多相关文章

  1. 由一段JS代码引发的思考

    不知道大家在编程的时候有没有遇到过这种情况,就是在循环遍历删除一部分内容的时候,发现只能删除其中一部分,而另一部分却总也删不掉,然后觉得自己的逻辑没有问题啊,于是陷入了深深的抑郁之中…… 昨天在处理一 ...

  2. 一段js MD5。加密 转换C#语法过程

    A 帮忙把这段js脚本转换 c#语言. JS: function md5 (bit,sMessage) {debugger //var sMessage = this; function Rotate ...

  3. 让ie支持placeholder属性,一段js搞定

    placeholder属性真的是超级好用的新属性,可惜,只有新版浏览器才支持,为了写出输入框贴心提示,老方法就是加span标签覆盖,营造出placeholder提示的感觉,现在安利一款好用的js,好用 ...

  4. 分享一段js,判断是否是在iPhone中的Safari浏览器打开的页面

    头部引用jquery包 将下面的一段js写在</body>的前面 <script type="text/javascript"> var ua = navi ...

  5. 一段JS控制TD中图片的大小的代码

    一段JS控制TD中图片的大小的代码 <table><tr><td id="otd"><div></div><img ...

  6. 一天一小段js代码(no.4)

    最近在看网上的前端笔试题,借鉴别人的自己来试一下: 题目: 写一段脚本,实现:当页面上任意一个链接被点击的时候,alert出这个链接在页面上的顺序号,如第一个链接则alert(1), 依次类推. 有一 ...

  7. 一天一小段js代码(no.2)

    (一)可以用下面js代码来检测弹出窗口是否被屏蔽: var blocked = false ; try { /*window.open()方法接受4个参数window.open(要加载的url,窗口目 ...

  8. 我要崩溃了,要解出这么一段js代码背后的东西,这真是一坨啊,别被高度欺骗了,他还有宽度!!!!!试着按下方向右键

    一坨js代码: function s_gi(un, pg, ss) { var c = "s.version='H.26';s.an=s_an;s.logDebug=function(m){ ...

  9. 在使用IWMS的时候,IWMS自带函数样式无法满足我们需求。以下一段JS是实现左图右字的适用于IWMS的代码。

    <div class="wz-list">里边需要有html做好的Html代码样式</div> <script> var attrnew = & ...

随机推荐

  1. Linux上java环境变量配置

    1.java配置 配置环境变量在/etc/profile下增加 # set Java environment JAVA_HOME=/usr/share/jdk1.6.0_43 PATH=$JAVA_H ...

  2. TCP三次链接和四次断开

    经典的三次握手示意图:(#add,“握手”即图中左边到右边的连线)    经典的四次握手关闭图:    TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即t ...

  3. MVC – 4.mvc初体验(2)

    5.显示学员列表 效果 数据表 5.1 首先,在文件夹Models新建一个新建项(W),选择ADO.NET 实体数据模型 (SingleTest.edmx) 5.2 建一个控制器,StudentsCo ...

  4. mysql字符编码相关

    mysql> show variables like '%character%'; +--------------------------+--------------------------- ...

  5. HashMap在Java1.7与1.8中的区别

    基于JDK1.7.0_80与JDK1.8.0_66做的分析 JDK1.7中 使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,如果hashcode相同, ...

  6. python沙盒逃逸

    前言 最近遇到了很多python沙盒逃逸的题目(不知道是不是因为现在python搭的站多了--),实际使用时发现只会复制别人的payload是不够用的,于是自己来总结一波(顺带一提python沙盒逃逸 ...

  7. CentOS服务器安装Telnet来远程连接服务器

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在连接远程服务器时有很多种连接方式,如SSH.telnet.SFTP等.但是如果大家在docker上面安装gitlab做 ...

  8. functools.wraps 带参数的装饰器 多个装饰器装饰同一个函数

    装饰器开发原则 : 开放封闭原则装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args, ...

  9. hiho1393二分图多重匹配

    题目链接:[http://hihocoder.com/problemset/problem/1393] 题意:中文题意. 题解:二分图的多重匹配.主要是建图然后跑一个最带流,再判断一下就可以了. 建图 ...

  10. 【BZOJ 3043】 3043: IncDec Sequence (差分)

    3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 589  Solved: 332 Description 给 ...