在JS中没有类的概念,继承是通过对象和对象之间实现的。其中主要是利用prototype属性来实现的。
函数中的prototype属性,又叫原型对象。构造函数可以通过prototype属性来添加函数。这样做到代码的简单性,避免冗余代码。还可以通过prototype属性来实现继承。
例如:
<span style="font-size:18px;">function Person(name,age,email) {
this.user_name = name;
this.user_age = age;
this.user_email = email;
}
Person.prototype.sayHi=function(){
alert (this.user_name+' '+this.user_age+' '+this.user_email);
}
var p1=new Person('ss',18,'ss@163.com');
p1.sayHi();
function student(sid) {
this.user_ID = sid;
}
student.prototype = p1;
var s1 = new student(001);
s1.user_name = 'sss';
s1.user_age = 10;
s1.sayHi();
</span>
上面这个例子就是一个继承的实现,student继承了person,本身student没有user_name,user_age,user_email等字段。通过让student的prototype属性等于p1然后指向了p1,此时p1指向的是person。所以这样就间接的继承了person。
下面是通过浏览器调试的执行结果
从上面这幅图更清晰的看到s1的__proto__是person,person的__proto__指向了sayHi方法。
PS
prototype原型对象中的值是只读的,不能修改。当变量“修改的时候”只是在自身的基础上增加了一个属性,并没有修改原型中的值。
对于原型中的引用类型,修改的时候只是修改了引用地址下面的值(栈中的值),对于原型中的地址没有改变。如果引用类型都做修改的话,也会自己创建一个属性。这样原型里面的值还是没有改变。