JS伪继承prototype实现方法示例
本文实例讲述了JS伪继承prototype实现方法。分享给大家供大家参考,具体如下:
众所周知JS中没有类的概念,但是要想实现类的功能可以同过function模拟。如:
第一种继承(属性继承)
//该函数相当于是一个构造器,也是一个伪类
functionFn(){
this.a=4;
this.b=5;
this.log=function(){
console.log(this.a,this.b);
}
}
functionFn1(){
Fn.call(this);//调用父类的构造函数
}
Fn1.prototype=Fn.prototype;
varfn=newFn();
varfn1=newFn1();
//由此可见Fn1是fn1的子类。
fn1instanceofFn;//true
fninstanceofFn1;//true
fn.a=5;
//由此可见Fn1继承了Fn得所有属性和方法
//而是是复制了一份Fn的属性和方法,并不是对象的引用。
console.log(fn.a);//5
console.log(fn1.a);//4
this.log();//45
总结:这种继承,是重新拷贝一份放入内存中,他们的值互相独立,修改一个不会改变另一个。
第二种继承原型继承(prototype)
functionFn(){}
Fn.prototype.data={
name:'zhangsan'
}
Fn.prototype.getName=function(){
returnthis.data.name;
}
functionFn1(){}
//原型链继承
Fn1.prototype=Fn.prototype;
varfn=newFn();
varfn1=newFn1();
//所用Fn1继承了Fn
fn1instanceofFn;//true
console.log(fn1.getName());//zhangsan
console.log(fn.getName());//zhangsan
//修改了fn的name属性值
fn.data.name='lisi';
//由此我们可看出原型链继承是引用继承
//不会重新拷贝一份变量。就像对象的引用一样。
console.log(fn.getName());//lisi
console.log(fn1.getName());//lisi
两种类的写法造成示例的区别
//第一种
functionFn(){
this.a=4;
this.b=5;
this.log=function(){
console.log(this.a,this.b);
}
}
varfn1=newFn();
varfn2=newFn();
fn1.a=1;
//由此可以看出两个对象互不影响
//说明每个对象里都存在一份a和b
fn1.log();//15
fn2.log();//45
//第二种
functionFn(){}
fn.prototype.name='zhangsan';
fn.prototype.data={
a:4,
b:5
}
fn.prototype.log=function(){
console.log(this.data.a,this.data.b);
}
varfn1=newFn();
varfn2=newFn();
fn1.a=1;
//由此可见就算是不同的示例他们他们所指向的值是同一个。
fn1.log();//15
fn2.log();//15
fn2.name='lisi';
//这里fn1.name并没有被修改
console.log(fn1.name);//zhangan
console.log(fn2.name);//lisi
总结
类中直接this.出来的属性和方法都会直接复制一份给子类或者实例对象。个子类或实例对象之间互不影响。
使用prototype增加的属性和方法,对象类型的只有一份,值类型的这会被复制。
收获
由于函数都是通用的,所以比较上面两种方法,第二种明显比第一种性能要好的多,因为避免了没有必要的复制,肯定会比较节省内存。所以以后写类的时候,尽量使用第二种方式。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。