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( ));     //
console.log(array2.sum( ));        //

总结:使用 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());     //

如何使用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()); //

示例二:

/*定义一个人类*/
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( );

javascript基础-js继承的更多相关文章

  1. Javascript 基础--JS函数(三)

    一.基本概念:未完成某一个功能的代码(语句,指令)的集合. 二.函数的调用方式: 2.1.函数名(传递参数1,传递参数2)   基本语法 function 函数名(参数列表){ //代码; retur ...

  2. Javascript基础 - js中曾经忽略的知识点

    深入那些曾经忽略的Javascript知识 1. parseInt(string, [radix]),parseFloat(string) 一般我们省略第二个参数,parseInt(‘100’) == ...

  3. javascript基础-js对象

    一.js对象的创建 1.普通最简单的方式 var teacher = new Object( ); teacher.name = "zhangsan"; teacher.age = ...

  4. JavaScript基础 -- js常用内置方法和对象

    JS中常用的内置函数如下: 1.eval(str):计算表达式的结果. 2.parseInt(str,n):将符串转换成整数数字形式(可指定几进制). 3.parseFloat(str):将字符串转换 ...

  5. javascript基础-js函数

    一.创建函数的方式 1)普通方式 function cal( num1, num2 ) { return num1+num2; } 2)使用变量初始化方式 var plus = function(nu ...

  6. JavaScript(JS)简介

    历史背景介绍 (Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript ...

  7. 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)

    摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...

  8. 前端(十二)—— JavaScript基础操作:if语句、for循环、while循环、for...in、for...of、异常处理、函数、事件、JS选择器、JS操作页面样式

    JavaScript基础操作 一.分支结构 1.if语句 if 基础语法 if (条件表达式) { 代码块; } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通 ...

  9. javascript基础入门之js中的结构分支与循环语句

    javascript基础入门之js中的结构分支与循环语句 程序的结构①顺序结构:自上而下:②选择(分支)结构:多条路径,根据不同的条件,只执行其中一个:③循环结构:重复某些代码④配合特定的语句实现选择 ...

随机推荐

  1. web前端看IE11的变化

    一.User-agent的变化 IE11的User-agent Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko IE10的U ...

  2. 适配器模式(Adapter Pattern)/包装器

    将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 模式中的角色 目标接口(Target):客户所期待的接口.目标可以是具体的或 ...

  3. Linux下的ASLR(PIE)内存保护机制

    1.1    Linux下的ASLR内存保护机制 1.1.1    Linux下的ASLR工作原理 工作原理与window下的aslr类似 1.1.2 Linux下利用内存地址泄露绕过ASLR ⑴.  ...

  4. web运行异常解决

    端口占用: 在dos下,输入  netstat   -ano|findstr  8080 //说明:查看占用8080端口的进程 显示占用端口的进程 taskkill  /pid  6856  /f   ...

  5. 经典问题:查询有多少段区间和等于k值

    题目连接 题意:在大小为1e5以内的数组求存在多少个区间和的值等于k的次方 这种题很经常见,总是想着用两个for循环解决,但是一定会超时. 题解:算出前缀和,使用map去查找mp[sum[i+1]-t ...

  6. WIN7不能上网

    http://zhidao.baidu.com/link?url=lYL0Sti_nX3JDz3pA3cVh49nyYDEQBJ6P5fxwB4La0FurHlgmWGMdgfMGjQSWxj17sH ...

  7. (转)MapReduce Design Patterns(chapter 7 (part 2))(十四)

    External Source Input Pattern Description 这种模式不从hdfs加载数据,而是从hadoop以外系统,例如RDB或web service加载. Intent 想 ...

  8. js的事件循环机制和任务队列

    上篇讲异步的时候,提到了同步队列和异步队列的说法,其实只是一种形象的称呼,分别代表主线程中的任务和任务队列中的任务,那么此篇我们就来详细探讨这两者. 一.来张图感受一下 如果看完觉得一脸懵逼,请继续往 ...

  9. Python报错IOError: [Errno 22] invalid mode ('r') or filename

    IOError: [Errno 22] invalid mode ('r') or filename: 这种错误的出现是在使用built-in函数file()或者open()的时候. 或者是因为文件的 ...

  10. yum源笔记

    1. epel源,使用yum安装htop http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm 2 ...