javascript面向对象编程笔记01

声明类

/* 在该对象内部声明的对象如果加上this就表示是公有的,否则就是私有的,只能在该对象内部使用   */
/* 声明一个对象  */
function Lecture(name , teacher){
	var id = 3 ;
	this.name = name ;
	this.teacher = teacher ;
	this.publicFun = function(){
		alert("public method");
		privateFun();
	}
	var privateFun = function(){
		alert("private method");
	}
}


/* 在外部通过prototype属性给Lecture对象再添加一个公共方法  */
Lecture.prototype.display = function(){  
	return this.teacher + " is teaching " + this.name ;  
}


/* 在外部通过prototype属性给Lecture对象再添加一个公共属性 */
Lecture.prototype.time = '08:30';  


var l = new Lecture("english" , "zhoufeng");


l.publicFun() ;	//调用公共方法
// l.privateFun();	私有方法是不能够调用成功的


alert(l.display()); 	//调用通过prototype添加的方法


alert(l.time);  //调用共有属性


//alert(l.id);	私有属性调用不能成功


创建对象

/* 使用大括号的语构造对象下面的sender对象有一个id属性和handlMessage函数 都是公共的   */
var sender = {
	id:5 ,
	handlMessage:function(){
		alert(this.id);
	}
}
/* 上面的方式等同于下面这种方式   */
var sender2 = new Object();
sender2.id = 5 ;
sender2.handlMessage = function(){
	alert(this.id);
};

sender.handlMessage();    
sender2.handlMessage() ;

所有的全部变量都是window的属性

function fun(){
	alert("fun");
}

var xxx = "hello world!";

//通常使用时会省略window  
alert(window.xxx);  // = xxx ;
window.fun(); // = fun();


如果在函数内部没有使用 var 去声明一个变量,那么该调用该函数后。该变量就会成为window对象的属性

function fun(){
//	var	foo = "hello world";  如果使用var明确定义。foo就不会成为window对象的属性
	foo = "hello world";
}

fun();

alert(window.foo);	// 发现foo已经成为window对象的属性了

通过匿名函数闭包的方式隐藏全局变量 。 让全局变量只对自己的代码块有用,避免多个js库发生冲突

  
/* 该匿名函数里面的内容会直接执行,可以将自己的js内容都写在该匿名函数内,就不会影响到其他js库了   */
(function(){
	
	var msg = "hello world";
	
	function User(name , age){
		this.name = name ;
		this.age = age ;
		this.toString = function(){
			return "name:" + this.name + " age:" + this.age ;
		}
	};
	
	var user = new User("name" , 34);
	
	//alert(user);
	
		
})();

alert(window.msg);	//这里就访问不到了



闭包(内部函数访问外部函数的属性)产生的问题。

闭包允许你引用存在于父级函数中的变
量。然而,它并不是提供该变量创建时的值;它提供的是父级函数中该变量最后的值。你会
看到这个问题最通常是在一个for 循环中。有一个变量被用作迭代器(比如i),在for 内部新
的函数被创建,并使用了闭包来引用该迭代器。问题是,当新的闭包函数被调用时,它们将
会引用该iterator 最后的值(比如,一个数组的最后位置),而不是你所期望的那个。程序2-16
的例子说明,使用匿名函数激发作用域,在其中创建一个合乎期望的闭包是可能的。


/* 错误的写法 ,如果用下面这种写法,那么所有的get方法都会返回之后一个key所对应的值  */
function Info(properties){
	for(var key in properties){
		this["get" + key] = function(){    
			return properties[key] ;  
		}
	}  
}


/* 正确的写法 */
function Info(properties){
	for(var key in properties){
		(function(){
			//必须要使用这样的方式,将值保存在匿名函数的作用域。然后再返回  不可以直接return properties[key]
			var item = properties[key] ;  
			arguments[0]["get" + key] = function(){  
				return item ;  
			}  
		})(this); // 将Info的上下文通过参数传递到匿名函数内
	}
}

var i = new Info({name:"zhoufeng" , age:"19"});

alert(i.getname());
/* 正确的写法 */
function Info(properties){
	for(var key in properties){
		(function(){
			//必须要使用这样的方式,将值保存在匿名函数的作用域。然后再返回  不可以直接return properties[key]
			var item = properties[key] ;  
			//不需要得到Info的上下文,直接使用prototype属性也可以绑定方法到Info对象上面
			Info.prototype["get" + key] = function(){       
				return item ;  
			}  
		})();
	}
}



该变默认的上下文执行函数

function changeColor(color){
	this.style.color = color ;       
}        

//changeColor("red"); 如果直接这样调用,会出错,因为上面的this指向的是window对象,window对象没有style属性

//下面的方式调用,表示使用id为div的dom对象作为上下文去调用changeColor方法,也就是this指向的是dom对象了
changeColor.call(document.getElementById("div") , "red");

静态方法

/* 为Info添加一个cloneUser静态方法   添加非静态方法 为 Info.prototype.xxx = function(){} */
Info.cloneUser = function(user){
	return new Info(
		user.getname() ,
		user.getage()
	);
}


未完待续》。。。。。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值