js中的prototype和基于prototype的继承总结

来源:互联网 发布:云南进出口贸易数据 编辑:程序博客网 时间:2024/06/10 05:36

与其他编译语言的继承相比,javascript也有一套继承实现方式,即使用prototype原型及其链的方式。

1、我们先用一个简单的例子先理解原型链,

function superClass(){
this.value = “super”;
}

superClass.prototype.getSuperValue = function(){
return this.value;
}
 
function subClass(){
this.subClassValue = “sub”;
}

subClass.prototype = new superClass();
subClass.prototype.getSubValue = function(){
return this.subClassValue;
}

 
var s = new subClass();
alert(s.getSuperValue());
我们声明了俩个构造方法:subClass 和superClass,每个构造函数都有一个原型属性(本地无法访问)指向该构造方法的原型对象,

原型对象有个constructor属性指向构造方法,实例中prototype属性指向原型。我们还知道所有对象都是继承

Object的,其实在每个构造方法的原型对象中还有一个指向Object.prototype的属性,object.prototype中的constructor又指向

object,这样就形成了一个prototype链。

现在我们来分析subClass.prototype = new superClass(); subClass.prototype 指向superClass的实例意味着什么呢,意味着

subClass.prototype指向了superClass的prototype,所以就能访问到原型中的属性和方法。

这时的弹出框消息为”super”. 这下应该就很明白为什么了吧。

2、还有一种实现继承的方式,就是借用构造方法

function superClass(){
this.name = [‘Eason’]
}

function subClass(){
superClass.call(this);//实现继承
}

var sub = new subClass();
alert(sub.name);
sub.name.push(‘hou’);
alert(sub.name)
3、组合继承:就是将原型链继承还构造函数继承结合在一起,使用原型链对原型属性和方法的继承,使用构造方法来实现对实例属性的继承

原型继承的缺点:原型中定义的属性被多个实例共享

构造方法的确定:方法都在构造方法中定义,复用率几乎为0

function superClass(name){
this.name = name;
this.color= [‘red’,’yellow’];
}

superClass.prototype.sayName = function(){
return this.name;
}

function subClass(name,age){
superClass.call(this,name);
this.age = age;
}

subClass.prototype = new superClass();
subClass.prototype.sayAge = function(){
return this.age;
}
var sub = new subClass(‘Eason’,26);

alert(sub.color);
alert(sub.sayName());
alert(sub.sayAge());

4、还有一种比较常用的就是原型是继承,思想就是原型可以基于已有的对象创建新的对象,

我们先构造一个工具方法:

function createObj(o){
function fun(){
 
}

fun.prototype = o;
return new fun();
}

用法:
var obj = {
name : ‘Eason’,
}

var o = createObj(obj);
alert(o.name);
o.name = ‘hou’;
alert(o.name);
通过上面的例子可以对prototype的基本用法有个简单的了解,如果各位看客有什么意见请留言,谢谢!

0 0
原创粉丝点击