您的位置:首页 > Web前端 > JavaScript

JavaScript之组合继承(伪经典继承)

2013-03-15 09:50 148 查看
今天在了解javascript的组合继承时,发现此种继承方式结合了原型链和借用构造函数的方式来实现的,下面对此种继承的方式记录下来,首先来了解实现组合继承的过程。

<script type="text/javascript">
function parent(name) //定义父类
{
this.name=name;  //parent实例属性name
this.color=["red","blue","yellow"]; //parent实例属性color,这个属性值得注意的地方是它的类型是引用类型的
}
parent.prototype.world="Hellow";
parent.prototype.num_arr=[1,2,3,4];    //在原型prototype上添加的属性,在原型prototype对象上添加的属性和方法都是可以共享的
parent.prototype.say=function(){alert('parent_say');} //在原型prototype上添加的方法

function son(name,age)   //定义子类
{
/*
parent.call(this,name); 调用父类构造函数
通过借用构造函数的方式来专门实现继承属性
,主要是继承实例属性name,age,color
,而不是父类的原型上添加的属性num_arr
,从而做到每个实例对象(下面实例化的对象s1,s2)都有自己的私有属性name,age,color
,这样在修改各自的私有属性时互不影响,特别是在修改引用类型的属性color的时候.
*/
parent.call(this,name);
this.age=age;  //son的实例属性age
}
/*
son.prototype=new parent("jackie"); 原型继承
通过原型链的形式来是实现继承是一种常见的方式,在应用中,如果实例对象要共享某个方法或属性时,
则通过在prototype对象上进行添加属性和方法是实现共享引用类型属性(num_arr)和方法(say)的一种最佳方式
*/
son.prototype=new parent("jackie");

var s1=new son("lily",34);
var s2=new son("kate",28);

s1.color.push("black");   //这是s1对象对parent.color实例属性进行了操作,但是却不会影响到s2.color
alert("s1.color="+s1.color+"\ns2.color="+s2.color);
/*
这是上面的输出结果
s1.color=red,blue,yellow,black
s2.color=red,blue,yellow
*/

s1.num_arr.push(5);
alert("s1.num_arr="+s1.num_arr+"\ns2.num_arr="+s2.num_arr);
/*
这时对parent.prototype上的引用类型属性(num_arr)进行操作时,会影响到s2.num_arr
,原因就是prototype对象添加的属性都是共享的,尤其是添加的引用类型的属性
s1.num_arr=1,2,3,4,5
s2.num_arr=1,2,3,4,5
*/
s1.world="China";
alert("s1.world="+s1.world+"\ns2.world="+s2.world);
/*
这是s1对象对parent.prototype对象的非引用类型属性world进行操作,这时也不会影响到s2.world
输出结果为:
s1.world=China
s2.world=Hellow
*/
</script>


原文地址:http://handyxuefeng.blog.163.com/blog/static/45452172201162014851622/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: