写了很久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(){...} 来定义。

最新文章

  1. windows下的命令行工具babun
  2. 信息系统实践手记6-JS调用Flex的性能问题一例
  3. C++重载流运算符,将存储结构体的vector直接写入文件
  4. 面向对象的JavaScript(3):私有成员和公开成员
  5. Linux Shell系列教程之(十四) Shell Select教程
  6. js中的DOM操作(2)
  7. E: 软件包*需要重新安装,但是我无法找到相应的安装文件。(ubuntu14.04)
  8. jdbc调用存储过程的方法
  9. STM32的GPIO使用的函数剖析
  10. sicily-2499 平方数
  11. Flex4 flashVars 传值
  12. Mysql报错注入原理分析(count()、rand()、group by)
  13. 使用gc、objgraph干掉python内存泄露与循环引用!
  14. POJ 2084 Catalan数+高精度
  15. Python_让人脑阔疼的编码问题(转)+(整理)
  16. Snowflake Snow Snowflakes POJ - 3349(hash)
  17. utf-8 编码问题
  18. js基础-运算符
  19. JAVA面试相关
  20. CWorkBooks、CWorkBook、CWorkSheets、CWorkSheet、CRange

热门文章

  1. curl 发送请求的时候报错
  2. JSP基础与提高(一).md
  3. TGPPen 宽度的理解
  4. 20165301 预备作业二:学习基础和C语言基础调查
  5. js 获取定位信息
  6. 监控属性数组(Observables Arrays )
  7. css3实现立方体,并且自转效果
  8. linux 笔记(一)
  9. 转:Meltdown Proof-of-Concept
  10. 洛谷P2812 校园网络[数据加强版] [Tarjan]