您的位置:首页 > 其它

面向对象的程序设计2

2016-03-12 19:46 155 查看
继承
<1>原型链
利用原型让一个引用类型继承另一个引用类型的属性和方法
function dad(){
this.prototype=true;
}
function son(){
this.sonprototype=false;
}
//继承dad
son.prototype=new dad();
原型链出现的问题:共享问题
function dad(){
this.colors=["red","blue","green"];
}
function son(){

};
//继承
son.prototype=new dad();
var a =new son();
a.colors.push("black");
alert(a.colors);   //"red,blue,green,black"
var b=new son();
alert(b.colors);   //"red,blue,green,black"

<2>借用构造函数---------使用call和apply
function dad(){
this.colors=["red","blue","green"];
}
function son(){
//继承dad()
dad.call(this);
}
var a =new son();
a.colors.push("black");
alert(a.colors);   //"red,blue,green,black"
var b=new son();
alert(b.colors);   //"red,blue,green"
优点:可以传参数
function dad(name)
{
this.name=name;
}
function son(){
//继承
dad.call(this,"william");   //传参数
this.age=21;
}
var a=new son();
alert(a.name);    //"william"
alert(a.age);            //21
缺点:方法都在构造函数中定义,函数没法复用

<3>组合继承
原型类:继承原型属性和方法
借用构造函数:继承实例属性
function dad(name){
this.name=name;
this.colors=["red","blue","green"];
}
dad.prototype.sayname=function(){
alert(this.name);
};          //分号
function son(name,age) {  //借用构造函数
//继承属性
dad.call(this, name);
this.age = age;

//继承方法  -------原型链
son.prototype = new dad();
son.prototype.constructor = son;
son.prototype.sayage = function () {
alert(this.age);
}
}
var a=new son("cyc",20);
a.colors.push("black");
alert(a.colors);        //"red,blue,green,black"
a.sayname();           //"cyc"
a.sayage();            //20

var b=new son("william",21);
alert(b.colors);        //"red,blue,green"
b.sayname();           //"william"
b.sayage();            //21

<4>原型式继承
function object(o){
function F(){};
F.prototype=o;
return new F();
}
在object()函数内部,先创建了一个临时性的构造函数,
然后将传入的对象作为整个构造函数的原型,最后返回了
整个临时类型的新实例

-------------example--------------
var person={
name:"william",
friends:["cyc","aaa"]
}
var person1=object(person);
person1.name="b";
person1.friends.push("bbb");
var person2=object(person);
person2.name="c";
person2.friends.push("ccc");
alert(person.friends);       //"cyc,aaa,bbb,ccc"

<5>寄生式继承
function createAnother(original){
var clone=object(original);
clone.sayHi=function(){
alert("hi");
}
return clone;
}
<6>寄生组合式继承
function dad(name)
{
this.name=name;
this.colors=["red","green"];
}
dad.prototype.sayname=function(){
alert(this.name);
}
function son(name,age){
dad.call(this,name);   //第二次调用dad()
this.age=age;
}
son.prototype=new dad();    //第一次调用dad()
son.prototype。constructor=son;
son.prototype.sayage=function(){
alert(this.age);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: