JS_function

一.JS中函数名也是变量,因此可以直接入参,函数体本身也能包含另外一个函数体,例:

    1.基本数据类型比较(顺序,或者倒叙),

    2.JavaScript对象的排序,根据对象的某个属性排序,

上述两个类型的排序要写多个方法,由于JS函数的特性,可以一次搞定:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	//JavaScript中嵌套函数的入参方式,可以理解成先“里”后“外”
	//如,自定义排序,在调用数组的sort(),sort的参数可以是一个有比较功能的有两个参数的函数,这两个参数首先被传入里层
	function createComparisonFunction(propertyName){
		return function(object1,object2){
			var valueF=object1[propertyName];
			var valueS=object2[propertyName];
			return valueF-valueS;
		};
	} 
	function nestFunction(){
		var data=[{"name":"Nicholas","age":44},{"name":"Zaohan","age":24}];
		data.sort(createComparisonFunction("name"));
		alert(data[0].name);
		data.sort(createComparisonFunction("age"));
		alert(data[0].name);
	};
</script>
</head>
<body>
ECMAScript函数名本身就是一个就是一个变量,可以入参<br><br>
<input type="button" οnclick="nestFunction();" value="属性的比较">
</body>
</html>
查看两次alert()的结果即知,将基本类型略去。

2.调用方法:

call();

apply();

bind();返回的新的方法的引用,被绑定某个对象上;

二:JS函数的原型属性

1.JS的函数有一个原型(prototype)的属性,该属性是一个指针,指向一个对象,该对象包含了特定类型所有实例所共享的属性和方法。

故原型中定义的方法为该类型所有实例所共享。

<script type="text/javascript">
	window.οnlοad=function(){
		var inputEles=document.getElementsByTagName("input");
		inputEles.item(0).οnclick=function(){
			//申明构造函数
			function Person(){
				
			}
			Person.prototype.name="Nicholas";
			Person.prototype.age=24;
			Person.prototype.sayName=function(){
				alert(this.name);
			};
			var person1=new Person();
			var person2=new Person();
			alert("两个person是否相等: "+(person1 == person2));//false
			alert("姓名是否相等: "+(person1.name == person2.name));//true
			alert("比较俩对象的方法是否相等: "+(person1.sayName == person2.sayName));//true
			alert("原型的constructor属性指回构造函数: "+(Person.prototype.constructor == Person));//true
		};		
	};
</script>

2.验证原型和实例之间的关系

			alert(Person.prototype);<span style="font-family: Arial, Helvetica, sans-serif;">//通过构造函数的引用n获取对象的原型</span>
			alert(Object.getPrototypeOf(person1) == Person.prototype);//通过实例获取对象的原型
<span style="white-space:pre">			</span>alert(Object.getPrototypeOf(person1).name);//"Nicholas"
			//验证实例和原型的关系
			alert(Person.prototype.isPrototypeOf(person1));
3.原型属性和实例属性

当为对象实例添加一个属性时,就会屏蔽原型对象中所保存的同名属性,但是并不会修改原型对象中的该属性,既是将该属性设置成null,也是在设置实例中该属性的值,并没有恢复其指向原型的连接。但是,通过delete操作符则完全可以删除实例中的该属性,从而能够重新访问原型中的这个属性。

		inputEles.item(2).οnclick=function(){
			function Person(){};
			Person.prototype.name="Nocholas";
			Person.prototype.age=24;
			Person.prototype.job="Software Engineer";
			var person1=new Person();
			person1.name="Baohan";
			alert(person1.name);//Baohan
			alert(Object.getPrototypeOf(person1).name);//Nicholas
			person1.name=null;
			alert(person1.name);//null
			alert(Object.getPrototypeOf(person1).name);//Nicholas
			delete person1.name;
			alert(person1.name == Object.getPrototypeOf(person1).name);//true
		};
4. 检测属性存在于原型中还是实例中:hasOwnProperty()和in操作符配合使用
		inputEles.item(3).οnclick=function(){
			function Person(){};
			Person.prototype.name="Nocholas";
			Person.prototype.age=24;
			Person.prototype.job="Software Engineer";
			var person1=new Person();
			//判断只存在于原型之中
			function existPrototype(obj,property){
				return property in obj && !obj.hasOwnProperty(property);
			}
			alert(existPrototype(person1,"name"));//true
			person1.name="Baohan";
			alert(existPrototype(person1,"name"));//false
			alert(person1.constructor == Person.prototype.constructor);
		};

5.动态原型

<span style="white-space:pre">		</span>inputEles.item(4).οnclick=function(){
			function Person(){};
 			Person.prototype={
				"name":"Nicholas",
				"age":24,
				"sayName":function(){
					alert("Hello , my name is "+this.name);
				}
			}; 
			var person1=new Person();
			Person.prototype.sayHi=function(){
				alert("Hello  ");
			};
			//实例对象中的存在原型的指针,所以能支持动态修改原型的属性和方法,会立即在对象实例上体现出来
			person1.sayHi();
			//对象创建后,重写原型,实例中的指针仍然指向原先的原型对象,并不会调用新的原型对象中定义的方法
			Person.prototype={
				"sayName":function(){
					alert("hahah");
				}
			};
			person1.sayName();//Hello , my name is Nicholas
		};	





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值