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( )); //
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继承的更多相关文章
- Javascript 基础--JS函数(三)
一.基本概念:未完成某一个功能的代码(语句,指令)的集合. 二.函数的调用方式: 2.1.函数名(传递参数1,传递参数2) 基本语法 function 函数名(参数列表){ //代码; retur ...
- Javascript基础 - js中曾经忽略的知识点
深入那些曾经忽略的Javascript知识 1. parseInt(string, [radix]),parseFloat(string) 一般我们省略第二个参数,parseInt(‘100’) == ...
- javascript基础-js对象
一.js对象的创建 1.普通最简单的方式 var teacher = new Object( ); teacher.name = "zhangsan"; teacher.age = ...
- JavaScript基础 -- js常用内置方法和对象
JS中常用的内置函数如下: 1.eval(str):计算表达式的结果. 2.parseInt(str,n):将符串转换成整数数字形式(可指定几进制). 3.parseFloat(str):将字符串转换 ...
- javascript基础-js函数
一.创建函数的方式 1)普通方式 function cal( num1, num2 ) { return num1+num2; } 2)使用变量初始化方式 var plus = function(nu ...
- JavaScript(JS)简介
历史背景介绍 (Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript ...
- 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)
摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...
- 前端(十二)—— JavaScript基础操作:if语句、for循环、while循环、for...in、for...of、异常处理、函数、事件、JS选择器、JS操作页面样式
JavaScript基础操作 一.分支结构 1.if语句 if 基础语法 if (条件表达式) { 代码块; } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通 ...
- javascript基础入门之js中的结构分支与循环语句
javascript基础入门之js中的结构分支与循环语句 程序的结构①顺序结构:自上而下:②选择(分支)结构:多条路径,根据不同的条件,只执行其中一个:③循环结构:重复某些代码④配合特定的语句实现选择 ...
随机推荐
- Apache编译安装
1.准备好源码包并配置好yum源,需要的源码包包括:httpd-2.4.18.apr-1.5.2.tar.gz.apr-util-1.5.4.tar.gz 2.准备用户 groupadd -r apa ...
- hdu 5802 Windows 10 (dfs)
Windows 10 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 淘宝TDDL配置以及使用
此章节具体介绍一下淘宝TDDL具体配置和使用 1. Spring配置文件配置:================spring-mybatis.xml 中配置============= <bean ...
- LeetCode OJ : Different Ways to Add Parentheses(在不同位置增加括号的方法)
Given a string of numbers and operators, return all possible results from computing all the differen ...
- nodejs之log4js日志记录模块简单配置使用
在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...
- Spring报错:java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
感谢:http://blog.chinaunix.net/uid-20681545-id-184633.html提供的解决方案,非常棒 ! 问题说明: 新建一个Spring项目,新建一个Bean类:H ...
- Kafka消费者生产者实例
为了更为直观展示Kafka的消息生产消费的过程,我会从基于Console和基于Application两个方面介绍使用实例.Kafka是一个分布式流处理平台,具体来说有三层含义: 它允许发布和订阅记录流 ...
- keras系列︱keras是如何指定显卡且限制显存用量
keras在使用GPU的时候有个特点,就是默认全部占满显存. 若单核GPU也无所谓,若是服务器GPU较多,性能较好,全部占满就太浪费了. 于是乎有以下三种情况: - 1.指定GPU - 2.使用固定显 ...
- rest-framework框架 -- 认证权限流程源码
认证权限 解析BaseAuthentication源码 # 做认证权限 from rest_framework import exceptions from ..models import * cla ...
- css 问题
问题1:使得在div中的图片自适应于Div的大小 图片放在DIV中是为了更好地管理,那么如果图片不能自适应与div的大小,则此事的初衷就会变质. 怎样自适应呢,有一个很简单的办法: img{ widt ...