javascript基础-js继承

 

 

1.prototype方式

 

示例:没有使用prototype(下列这些代码只能获取array1数组的总和,而无法对array2数据进行求和)

var array1 = new Array(1,4,9,13);
var array2 = new Array(15, 20, 35);

array1.sum1 = function( ) {
    var result = 0;
    for(var i=0; i<array1.length; i++) {
        result = result + array1[i];
    }
    return result;
};

 

示例:使用 prototype后

Array.prototype.sum = function( ) {
    var result = 0;
    for(var i=0; i<array1.length; i++) {
        result=result + array1[i];
    }
    return result;
}
//使用prototype代表对所有数组的求和计算
console.log(array1.sum1( ));     //27
console.log(array2.sum( ));        //27

 总结:使用 prototype 可以对某一类对象方法进行扩展

 

那么如何使用prototype继承?

示例:

// 父类
function
Parent( ) {     var name;     var age;     this.setName = function(thisName) {         name = thisName;     }     this.getName = function( ) {         return name;        }     this.setAge = function(thisAge) {         age = thisAge;        }     this.getAge = function() {         return age;        } }
// 子类
function Child( ) {

}
// 子类继承父类,将直接继承父类的所有public属性和方法 Child.prototype 
= new Parent(); var c = new Child(); c.setName("张三"); c.setAge(25); console.log(c.getName( )+" "+c.getAge( ));

 

 

2.apply方式

 

语法:

Function.apply(obj, args)  方法能接收两个参数

obj:这个对象将代替Function类里this对象

args:这个是数组,它将作为参数传给Function(args-->arguments)

 

apply方法的使用:

function Parent(name) {
    this.name = name;
    var age = 25;
    this.getAge = function( ) {
        return age;
    }
}
function Child(name) {
    this.say = function() {
        return this.name+" "+this.getAge();
    }
    this.getName = function(){
        return name;
    }
}
var c = new Child("张三");
Parent.apply(c,[c.getName()]); console.log(c.say());    
//张三 25 var c=new Child("张三"); Parent.apply(c,[""]); console.log(c.say());     // 25

 

如何使用apply继承?

示例一(不推荐):

function Parent(name) {
    var name = name;
    this.getName = function( ) {
        return name;
    }
}
function Child() {

}

var c = new Child();
Parent.apply(c,["张三"]);
console.log(c.getName());     // 25

 

 

示例二:

/*定义一个人类*/  
function Person(name, age) {  
    this.name=name;  
    this.age=age;  
}  
/*定义一个学生类*/  
function Student(name, age, grade) {  
    Person.apply(this, arguments);  
    this.grade = grade;  
}  
//创建一个学生类  
var student=new Student("zhangsan",21,"一年级");  
//测试  
console.log("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);  

分析:
Person.apply(this,arguments);
this:在创建对象在这个时候代表的是student
arguments:是一个数组,也就是[“zhangsan”,”21”,”一年级”];  通俗一点讲就是父类Person构造中的参数

 

 

3.call方式

与apply 方法非常类似,只不过是apply 中 args 中一个数据,而call 中是一个一个的参数

语法:

Function.apply(obj, arg1, arg2, ...)   可以接收(0-N)个参数

 

call 方法的使用

function Show() {
    console.log(this);   
}
// 1.直接调用:Show( );    这种调用方法其实是js 中的一种缩写
// 2.Show.call( );        这种才是js调用
Show.call( );           // window
Show.call(12);          // 将打印12,即show方法中的this值变为12

function Show2(name, age) {
    console.log(this, name, age);   
}
Show2("波哥", 25);                         // window, "波哥", 25
Show2.call("abc", "caoxiaobo", 25);       // {"abc"}, "caoxiaobo", 25

 

 如何使用call方法继承?

function A( ) {
    this.abc = 24;   
}
A.prototype.get = function( ) {
    console.log("abc的值为:" + this.abc);
}
function B( ) {
    A.call(this);            // 继承A的所有属性
}
B.prototype.save = function( ) {
    console.log("B方法中的save");   
}

B.prototype = A.prototype;    // 继承A的所有方法(注间,不能写在创建B对象的下面)
var b = new B();
var a = new A();
console.log(b.abc);
b.get( );
a.save( );

 

 

function Parent(name, age) {
    var name = name;
    var age = age;
    this.getName = function( ) {
        return name;
    }
    this.getAge = function( ) {
        return age;
    }
}
function Child() {

}

var c = new Child();
Parent.call(c,"张三", 20);
console.log(c.getName(), c.getAge());     // 张三 20

同样也可以这样写:

function Parent(name, age) {
    var name = name;
    var age = age;
    this.getName = function( ) {
        return name;
    }
    this.getAge = function( ) {
        return age;
    }
}
function Child(name, age) {
    Parent.call(c, name, age);
}

var c = new Child("张三", 20);
console.log(c.getName(), c.getAge());     // 张三 20

 

 

 

4.对象冒充

 

实现原理:让父类的构造函数成为子类的方法,然后调用该子类的方法,通过this关键字给所有的属性和方法赋值

function Parent(name) {
    this.name = name;
    var age = 40;
    this.getAge = function( ) {
        return age;
    }
}
function Child(name) {
    this.method = Parent;     // this.method是作为一个临时的属性,并且指向Parent所指向的对象,
    this.method(name);        // 执行this.method方法,即执行Parent所指向的对象函数
    delete this.method;       // 销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法
    this.say = function( ) {
        return this.name+" "+this.getAge();
    }
}
var c = new Child("李四");
console.log(c.say());

 

 

 

 

5.混合模式

 propotype + call / apply 方式

function Parent( ) {
    this.getAge = function( ) {
        return this.age;
    }
}

Parent.prototype.sayParent = function( ) {
   alert("this is parentmethod!!!");
}

function Child(name) {
    Parent.call(this);
    this.name = name;
    this.age = 40;
    this.say = function( ) {
        return this.name+" "+this.getAge( );
    }
}

Child.prototype = new Parent();
var c = new Child("张三");
console.log(c.say( ));
c.sayParent( );

 

posted @ 2018-08-25 15:57  cao_xiaobo  阅读(178)  评论(0编辑  收藏  举报