call()和原型继承的方法
1.call()
call()方法接受两个参数,obj和arg
比如functionA.call(obj,arg) 就是说现在运行(执行)functionA这个方法,但是functionA里面的方法不是为它以前的对象而运行了,把functionA的this强行改变成了obj
obj成为functionA中的this,然后来运行functionA这个方法,而arg是传给functionA的参数
function Student(props) {
this.name = props.name || 'Unnamed';
}
Student.prototype.hello = function () {
alert('Hello, ' + this.name + '!');
}
function PrimaryStudent(props) {
比如上面的代码,先定义了
Student.call(this, props);
this.grade = props.grade || 1;
}Student
方法,然后定义了PrimaryStudent
方法
在PrimaryStudent中,
Student.call(this, props);
指的是把this——也就是PrimaryStudent
对象作为运行时的那个this,把
Student
来运行
props传给Student作为参数,
这个方法,运行出来的结果是什么呢
Student
.name=
PrimaryStudent
props.name //这个props是传进来那个props
然后
PrimaryStudent
.prototype.hello = function () { alert('Hello, ' + this.name + '!'); } 它还获得了一个写在原型里的方法
则
PrimaryStudent
这个函数运行下来的结果相当于
functionPrimaryStudent
(props){
this.name = props.name || 'Unnamed';
this.prototype.hello = function () {
alert('Hello, ' + this.name + '!');
}
}
这就是call方法
它会运行一个函数,然后告诉这个函数你现在得用我给你的对象来运行你的那套方法,返回出什么东西是什么东西
2.原型继承
而原型继承呢
一般我们会先定义一个方法 比如刚才的Student
Student
方法里有属性,有定义在原型里的方法
然后我们想继承Student
,我们定义出一个新的函数 littleStudent
在这个新的函数内部我们 Student.call(this,arg) 在这里this指的是littleStudent,按上面定义的Student函数(内部拿this写属性和方法),我们会获得一个littleStudent它内部有Student的那些属性和方法
等于Student在我们littleStudent内部执行了一遍,并且是为我们造属性和方法的,我们littleStudent现在也有这些方法了
但这样是继承吗?Student日后有改变,我们的littleStudent会有改变吗,不会
因为我们只是拿call让Student
给我们也造了一套属性的方法,我们littleStudent
的原型仍然指向littleStudent.protptype
当前的原型链是职业的 new littleStudent
() ----> littleStudent
.prototype ----> Object.prototype ----> null 跟Student
没有关系
需要变成这样 new littleStudent
() ----> littleStudent
.prototype ----> Student.prototype ----> Object.prototype ----> null
那么怎么继承呢
先创建一个空函数F(){ }
把这个空函数的原型指向Student
的原型:F.prototype = Student.prototype;
然后把littleStudent的原型指向F的实例:littleStudent
.prototype=new F();
; 则littleStudent
的原型里包含了student原型里的所有内容
然后把littleStudent
原型的构造函数修复为littleStudent
:littleStudent
.prototype.constructor = littleStudent
; 因为之前littleStudent
.prototype=new F()
则new F().constructor
指向的是构造函数F
然后我们就可以继续在littleStudent对象的原型上添加方法和属性了
littleStudent
.prototype.getGrade = function () {
return this.grade;
};
而这并不会影响Student的原型,因为我们在这儿添加方法相当于是在new F()上添加方法
至此我们又给littleStudent
继承了Student的原型,又可以随意给它扩展,这就完成了一次继承
call()和原型继承的方法的更多相关文章
- 再谈javascript原型继承
Javascript原型继承是一个被说烂掉了的话题,但是自己对于这个问题一直没有彻底理解,今天花了点时间又看了一遍<Javascript模式>中关于原型实现继承的几种方法,下面来一一说明下 ...
- [转]Javascript原型继承
真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承.Javascript原型继承是一个被说烂掉了的话题 ...
- JS 原型继承的几种方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js方法和原型继承(一)
在js语言规范中并不存在方法这一概念,方便起见,将作为对象属性的函数成为方法this引用的规则a.在最外层代码中,this引用的是全局对象b.在函数内,this引用根据函数调用方式不同而不同函数内部的 ...
- javascript实现继承3种方式: 原型继承、借用构造函数继承、组合继承,模拟extends方法继承
javascript中实现继承的三种方式:原型继承.借用构造函数继承.混合继承: /* js当中的继承 js中 构造函数 原型对象 实力对象的关系: 1 构造函数.prototype = 原型对象 2 ...
- javaScript的原型继承与多态性
1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...
- JS继承之原型继承
许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...
- JS原型继承和类式继承
前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...
- JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
随机推荐
- uexQQ插件学习心得
uexQQ插件学习心得 uexQQ插件的作用:通过qq可以分享图文,音乐,应用到相应的qq空间.支持手机客户端分享和手机webQQ分享.下面我们就来看一看他的一些方法. 我们先说一下分享的步骤,这个步 ...
- 非常好的Oracle教程【转】
http://www.blogjava.net/kiant/articles/234781.html Oracle 笔记(四).SQL 几个要点 附录: 1.SQL 简介 2.SQL 操作符 3.Or ...
- asp.net 事件加载顺序
下面是母版页与内容页合并后事件的发生顺序: 母版页控件 Init 事件. 内容控件 Init 事件. 母版页 Init 事件. 内容页 Init 事件. 内容页 Load 事件. 母版页 Load 事 ...
- OA工作流规格--转
工作流是整个OA系统的核心,也是BPM的核心,工作流到 底需要实现哪些功能,本文就此以用户的需求为蓝本进行阐述.工作流表面看起来是很简单的,无非是一个表单模板,一个流程定义,然后起草后根据设定的流程一 ...
- chrome + vi
vimer们福利,一款能在chrome上面使用vim快捷键的插件 http://myhozz.com/2014/10/25/use-vim-in-chrome/
- Salesforce 执行顺序
在服务器上,Salesforce按以下顺序执行: 1,从数据库加载原始记录或初始化一个用于更新插入(upsert)语句的记录. 2,从请求加载新记录的字段值并覆盖旧的值. 如果请求来自一个标准的UI( ...
- app里使用163邮箱发送邮件,被163认为是垃圾邮件的坑爹经历!_ !
最近有个项目,要发邮件给用户设定的邮箱报警,然后就用了163邮箱,代码是网上借来的^^,如下: package com.smartdoorbell.util; import android.os.As ...
- 关于el jstl
requestScope表示从request范围内取得.其他的还有sessionScope, pageScope和applicationScope,分别对应4种属性范围.而如果直接写${passwor ...
- ADB server didn't ACK * failed to start daemon *
问题描述:在eclipse的Logcat出现错误 [2014-01-08 14:00:07 - adb] ADB server didn't ACK [2014-01-08 14:00:07 - ad ...
- css+div解决文字溢出控制显示字数
一.一般的文字截断(适用于内联与块): Example Source Code [www.mb5u.com] .text-overflow {display:block;/*内联对象需加*/widt ...