09 js自定义类与prototype关键字

js自定义类的理解

js自定义类,形式与功能上看起来就像java的类整体与类的构造方法的二合一。

在实例与类的关系上,又有点像java中子类与父类的关系,因为js的实例可以给自己添加自己的方法和属性。

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

posted @ 2020-01-17 20:13  Scorpicat  阅读(492)  评论(0编辑  收藏  举报