欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript的原型继承

程序员文章站 2022-06-15 14:55:00
...

前言
继承是面向对象语言得一个重要得特性和概念。许多得面向对象语言中都支持两种继承方式:接口继承和实现继承。但是JavaScript在所有面向对象得语言中是最独特的,它的独特在于它使用的是原型继承。

什么是原型呢

原型是一种抽象,代表事务表象之下的联系,用简单的话来说,就是原型描述事物与事物之间的相似性。就比如说人,人本来是一个对象,女人也是一个对象,女人以人为基础,但是她有自己的属性。原型继承要求必须有一个对象可以作为另一个对象的基础,这样就可以基于已有对象创建新的对象。javascript的所有函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型。

什么是原型链呢
由于javascript仅支持实现继承,主要是靠原型链来实现。 在javascript中,每个函数都有一个属性Prototype指向自身的原型,而由这个函数创建的对象也有一个__proto__属性指向这个原型,而函数的原型是一个对象,所以这个对象也会有一个__proto__属性指向这个原型,而函数的原型是一个对象,所以这个对象也会有一个__proto__指向自己的原型,这样逐层深入直到Object对象的原型。因为原型对象本身也是对象,他也有自己的原型。而它自己的原型对象又可以有自己的原型,这样就组成了一条链,这个就是原型链。 这里有点绕,下面举个例子说明一下:
 var o ={name:"我是祖宗"
			
			};
			//alert(typeof o);
		//	alert(typeof Object);
			
			//如果需要原型,那么就一定要有函数
			//每一个对象有一个属性叫_proto_这个属性就是这个对象的原型
			
			//alert(o.__proto__);
			
			//对象有原型,那么原型也是对象,原型也有原型
			//所有的对象都来自于Object的对象
			//所有的函数都来自于Function对象
			
			//所有的函数是对象,继承自Function.prototype
			//Function.prototype是对象,继承自Object.prototype
			//Object.prototype是对象,继承自null
			//obj是对象,继承自Object.Prototype
			
			//Function 是对象,继承自Function.prototype
			//Function是函数,继承自Function.prototype
			
			//js成员的访问规则
			//o.方法()
			//首先在O当前这个类型中寻找该成员的定义,如果存在该成员的定义
			//那么就直接使用该成员
			//如果该成员不再当前类型中,就访问其原型(原型链中的上一级)
			//以此类推,直到null位置
			var f1 = function(){
			  this.name = "我是亚当";
			 };
			 f1.prototype=o;
			 var foo1 = new f1();
			 
			 var f2 = function(){
			   this.name ="夏娃";
			 }
			 
			 var foo2 = new f2();
			 foo2.__proto__ = foo1;
			 
			 var f3 = function(){
			   this.name = "我是人类";
			 };
			 f3.prototype =foo2;
			 
			 var foo3 = new f3();
              alert(foo3.name);

这里最终的运行结果是“我是人类”,如果把 this.name = “我是人类”;注释了,就会显示“夏娃”,因为如果在对象本身中没有找到,就会去原型链中查找。同理如果把 this.name =“夏娃”;注释掉就会显示我是亚当。如果在整个原型链中都遍历过没有找到就会返回undefined.

原型继承

下面用模拟C#中的人类来说明原型继承

<!DOCTYPE html>
<html>
    <head>
	      <title></title>
		  <style type="text/css">
		  
		  </style>
		  <script type ="text/javascript">
		  //什么是原型继承
		  //如何实现原型继承
		  
		  //模拟C#中的人类
		  var o ={
		    say:function(){
			 if(this.name && this.age && this.sex)  alert("你好,我是"+this.name +",我今年" +this.age +"岁了,我是" +this.sex +"生");
			   
			},
			get_Name:function(){
			if(this.name) return this.name;
			},
			set_Name:function(value){
			 if(this.name) this.name = value;
			}
		  };
		  
		  var Person = function(name,age,sex){
		   this.name =name;
		   this.age =age;
		   this.sex =sex;
		  };
		  Person.prototype =o;
		  
		  var p1 = new Person("赵晓虎",19,"男");
		  
		  p1.say();
		  </script>
		</head>
		<body>
		  
		 </body>
</html>

总结
我感觉这个原型继承实际工作中应该没啥用,这应该是设计者的一个错误。虽然用不上,但是为了以后的学习,还是需要理解的。