原型的继承

来源:互联网 发布:诸城明诚学校网络平台 编辑:程序博客网 时间:2024/06/06 03:28

关于js中,继承。

继承的最基本应用

首先,定义一个Person作为构造函数,它包含两个内部属性,name和age

function Person(){
this.name = "zhang";
this.age = "2";
}
接着,对Person构造函数添加原型链上面的方法和属性,两个方法和一个属性。
Person.prototype = {
fam:"asdf",
sayName:function(){
alert(this.name);
},
sayAge:function(){
alert(this.age);
}

}

继续,利用定义构造函数Person的一个实例,为a

var a = new Person();
console.log(a.name);          //zhang

console.log(a.sayName);   //function(){alert(this.name);}

这都没有啥的,上面这些就是构造函数的基本应用。下面才是说到继承的内容呢....


继续,再定义一个Per的构造函数,它只有一个属性name

function Per(){
this.name = "ling";

}

1:继承所有的属性和方法

Per.prototype = new Person();

上面这一行代码就最基本的继承方式了,Per构造函数,继承了Person的方法和属性。

那么接下来,你可以用Per构造一个实例,看看情况呗:

var a = new Per();

console.log(a.name);           //ling

console.log(a.age);               //2

console.log(a.sayName);   //function(){alert(this.name);}

如上,Per虽然没有定义age属性,和sayName方法,但是实例中,依然存在了这个属性和方法,因为它继承了Person的属性和方法。

这个继承方式,是继承了Person中,内部的和原型链上的所有属性和方法。

同时要注意,这样的继承,会导致Per本身的原型链断链,所有要在构造函数定义之后,跟着就继承,然后再添加本身转有的原型链上的方法和属性。

关于原型链断链的情况,请查看:原型链断链的情况文章。

同时,只要是利用原型链继承来的属性或者方法,在当前的构造函数中,都是存在于原型链上的。

2:只继承原型链上的属性和方法

Per.prototype = Person.prototype;

这种继承,只会继承原型链上面的属性和方法,当然,单独继承原型链上的属性和方法的写法还有很多,这里就不多说了。有兴趣的话,可以去研究下。

定义一个实例:var a = new Per();

console.log(a.name);           //ling

console.log(a.age);               //undefined

console.log(a.sayName);   //function(){alert(this.name);}

因为age是内部的属性,所以这里不会被继承。

这里依然有一点要注意,要把继承,放在其他的原型链方法和属性的定义之前哦,当然是为了防止原型链断链了,又说了一遍。


3:只继承内部的方法和属性

方法呢,依然有几个,这里只写一个吧。

function Per(){

Person.call(this);

        this.age = "12";

}

定义一个实例:var a = new Per();

console.log(a.name);           //zhang

console.log(a.age);               //12

console.log(a.sayName);   //undefined

这个时候,就只会继承Person的内部属性,其实应该不算继承了吧,只是在这个运行了一下Person,然后把作用域改成Per了,所以,运行结束后,Per就有了Person的那几个内部属性了。。这个就是为了解决,引用类型,不能用在原型链上的那个bug。

不过呢,依然要把这个伪继承,放在最前面,那样,后面的属性和方法,万一和Person中有相同的,也可以把重复的覆盖掉了。

上面这种方法叫做,借用构造函数技术(或者伪造对象或者经典继承)。

感觉很不错的方法,有兴趣的可以查查看这个哦。


好了,就说这么多吧,继承的方法分为很多,因为每种继承,都有其优势,尤其劣势,这里就不统计了。感谢阅读!


注:2013.12.12:可以这么理解一下,在一个新的构造函数定义时,它只能最多使用一次字面量的写法,或者继承最多一个其他的构造函数,并且字面量和继承不能同时存在。可以理解为单一性吧,一个构造函数只能继承最多一个其他的构造函数,并且要把这个继承放在最前面,这个如果本身添加相同命名的属性或者方法时,则可以覆盖继承得来的方法和属性。

如果您发现文中,有错误的地方,或者描述不当的地方,欢迎指正!谢谢!

原创粉丝点击