一段js的思考

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

时间: 2024-11-05 14:54:51

一段js的思考的相关文章

由一段JS代码引发的思考

不知道大家在编程的时候有没有遇到过这种情况,就是在循环遍历删除一部分内容的时候,发现只能删除其中一部分,而另一部分却总也删不掉,然后觉得自己的逻辑没有问题啊,于是陷入了深深的抑郁之中…… 昨天在处理一段JS脚本的时候就遇到了这种问题,业务逻辑很简单,就是获取HTML某元素下的所有子元素,然后循环删除(其实更简单的方法是直接innerHTML赋值为空,这里只是讨论一下关于删除的问题).我发现每次删除完,总是有剩余,也就是删不干净,于是我进行了调试,发现当有3个元素时删除完还剩1个,4个元素剩2个…

Selenium-webdriver 系列Python教程(3)————如何执行一段JS

有时候在进行自动化测试时需要在页面上执行一段js 脚本, 这个时候就需要用到 execute_script 方法了. from selenium import webdriver BrowserObj_dirver = webdriver.Ie() BrowserObj_dirver.get( "http://www.soso.com") BrowserObj_dirver.implicitly_wait(5) BrowserObj_dirver.execute_script(&quo

关于node.js的思考

今天写了这段用node.js驱动mongoDB访问数据库的代码 function writeDB(receivedText, time, user) { var db_host = 'host'; var port = 27017; var username = "usr"; var pwd = "pwd"; var db_name = "db"; var result = ""; var mongoClient = mong

分析一段JS 动态织入代码

Function.prototype.before = function(beforefn) { var _self = this; return function() { beforefn.apply(this, arguments); return _self.apply(this, arguments); } } Function.prototype.after = function(afterfn) { var _self = this; return function() { var

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

一坨js代码: 1 function s_gi(un, pg, ss) { 2 var c = "s.version='H.26';s.an=s_an;s.logDebug=function(m){var s=this,tcf=new Function('var e;try{console.log(\"'+s.rep(s.rep(s.rep(m,\"\\\\\",\"\\\\\\\\\"),\"\\n\",\"\\\

让一段js只适用于ie8,在谷歌等浏览器上不要生效

第一个想到的是IE的条件注释,如下:用于html页面 <!--[if lte IE 8]> js代码 <![endif]--> 但是,IE10+浏览器已经跟条件注释say googbye了!因此,例如我的IE11浏览器的IE7, IE8兼容模式下,条件注释直接被吊死,没气了! 于是,为了更广泛的适用性,可以试试下面这个方法: if (!document.addEventListener) { // IE6~IE8 js代码 }

用一段JS代码来比较各浏览器的极限内存与运算速度

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> var initTime=new Date(); //程序执行初始时间 var odd=0; //计数器 //生成不同的对象 functio

请教一下前辈,这段js如何优化一下,是基于zepto来写的

var lastIndex = 0; $('#click-test').on('click',function(){ var pages = ['item-list','diag']; for(var i=0;;){ var index = parseInt(Math.random()*10) % pages.length; if(index != lastIndex){ lastIndex = index; break; } } var searchClass = pages[index];

sso跨域写cookie的一段js脚本

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script> var setcookitarray = ""; setcookitarray = "[\"http://passport.a.com/main/setCookie.do?domain=\",\"http://passport.