09 js自定义类与prototype关键字
js自定义类的理解
js自定义类,形式与功能上看起来就像java的类整体与类的构造方法的二合一。
在实例与类的关系上,又有点像java中子类与父类的关系,因为js的实例可以给自己添加自己的方法和属性。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。js自定义类的声明
声明方式也用关键字function,类名第一个字母大写,可以有参数(形如构造方法)。
通过this定义每个类的实例拥有的变量和函数
function Person(name,age){
				this.name = name;
				this.age = age;
				this.fav = "唱歌";
				//自定义类方法
				this.test = new Function("alert('这是Person的函数test')");
				
			}
  
类的实例(对象)
如下:
var p1 = new Person("小明",19);
			var p2 = new Person("小红",20);
			document.write(p1.name+"<br/>");
			document.write(p1.age+"<br/>");
			document.write(p1.fav+"<br/>");
			document.write(p1.test()+"<br/>");
			document.write(p2.name+"<br/>");
			document.write(p2.age+"<br/>");
			document.write(p2.fav+"<br/>");
			document.write(p2.test()+"<br/>");
  
运行结果:
小明
19
唱歌
undefined
小红
20
唱歌
undefined
创建的对象可以自行添加自己的方法和属性,其它对象无法访问这些属性和方法。
//添加实例的自定义方法和属性
			p1.run = function(){
				document.write("我在跑<br/>");
			}
			p1.run();
			// p2.run();无法执行,因为run函数时p1自定义的
  
prototype关键字
prototype翻译为“原型”,我们通常说“原型空间”。
在js中,每一个对象(函数,类,实例)都有自己的prototype空间,它可以被自己的实例访问,例如类的prototype空间,可以被它的每个实例访问(有一点类似ava中的静态变量),也可以自己访问。
注意:
- 自己访问自己的prototype空间需要加关键字prototype,如Person类访问自己原型空间的变量number:Person.prototype.number,如果不加prototype访问的就是普通的类变量number了
- 实例可以直接使用 实例名.原型空间中的变量名 的方式访问原型空间中的变量,如Person类的一个实例p1访问Person类中的number变量可以直接书写为:p1.number,值得注意的是,如果Person类中使用this定义了一个同名的非prototype修饰的变量,则p1.number访问的时普通的number而不是原型空间的number
- 同样的实例也有自己的方法,身为一个Person类的实例p1也可以给自己的原型空间中添加变量和方法:p1.prototype.color = "red";
测试代码:
<script type="text/javascript">
			//自定义类
			function Person(name,age){
				this.name = name;
				this.age = age;
				this.number = 10;
				Person.prototype.number = 9;
				// this.fav = "唱歌";
				// //自定义类方法
				// this.test = new Function("alert('这是Person的函数test')");
				this.doSubstract = function(str){
					document.write(str+"对Person的原型空间的number做了-1操作!")
					Person.prototype.number--;
					document.write("<br />");
				}
				Person.prototype.cry = function(){
					document.write("55555555555");
				}
			}
			var p1 = new Person("小明",19);
			var p2 = new Person("小红",20);
			document.write(p1.name+"<br/>");
			document.write(p1.age+"<br/>");
			//p1访问Person的prototype原型空间的变量number
			document.write("p1访问了Person的原型空间的number变量:"+p1.number+"<br/>");
			p1.doSubstract("p1");
			//p2也可以访问Person的prototype原型空间的变量number
			document.write("p2访问了Person的原型空间的number变量:"+p2.number+"<br/>");
			//也可以访问用Person直接访问自己的prototype原型空间的变量number
			//但要加prototype关键字
			document.write("通过类(此Person类)直接访问自己原型空间的number变量:"+Person.prototype.number+"<br/>");
			p1.cry();
			document.write("<br/>")
			Person.prototype.cry();
		
			</script>
  
运行结果:
小明
19
p1访问了Person的原型空间的number变量:10
p1对Person的原型空间的number做了-1操作!
p2访问了Person的原型空间的number变量:10
通过类(此Person类)直接访问自己原型空间的number变量:8
55555555555
55555555555
 
                    更多精彩
		 
													 
													 
													 
													 
	 
		

