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对象作为Student运行时的那个this,把props传给Student作为参数,来运行Student这个方法,运行出来的结果是什么呢
PrimaryStudent.name=props.name //这个props是传进来那个props  
然后PrimaryStudent.prototype.hello = function () { alert('Hello, ' + this.name + '!'); } 它还获得了一个写在原型里的方法
PrimaryStudent这个函数运行下来的结果相当于
function PrimaryStudent(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原型的构造函数修复为littleStudentlittleStudent.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()和原型继承的方法的更多相关文章

  1. 再谈javascript原型继承

    Javascript原型继承是一个被说烂掉了的话题,但是自己对于这个问题一直没有彻底理解,今天花了点时间又看了一遍<Javascript模式>中关于原型实现继承的几种方法,下面来一一说明下 ...

  2. [转]Javascript原型继承

    真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承.Javascript原型继承是一个被说烂掉了的话题 ...

  3. JS 原型继承的几种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. js方法和原型继承(一)

    在js语言规范中并不存在方法这一概念,方便起见,将作为对象属性的函数成为方法this引用的规则a.在最外层代码中,this引用的是全局对象b.在函数内,this引用根据函数调用方式不同而不同函数内部的 ...

  5. javascript实现继承3种方式: 原型继承、借用构造函数继承、组合继承,模拟extends方法继承

    javascript中实现继承的三种方式:原型继承.借用构造函数继承.混合继承: /* js当中的继承 js中 构造函数 原型对象 实力对象的关系: 1 构造函数.prototype = 原型对象 2 ...

  6. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  7. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

  8. JS原型继承和类式继承

    前言 一个多月前,卤煮读了一篇翻译过来的外国人写的技术博客.此君在博客中将js中的类(构造)继承和原型继承做了一些比较,并且得出了结论:建议诸位在开发是用原型继承.文中提到了各种原型继承的优点,详细的 ...

  9. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

随机推荐

  1. Window Azure ServiceBus Messaging消息队列技术系列2-编程SDK入门

    各位,上一篇基本概念和架构中,我们介绍了Window Azure ServiceBus的消息队列技术的概览.接下来,我们进入编程模式和详细功能介绍模式,一点一点把ServiceBus技术研究出来. 本 ...

  2. Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果]    [功能] 下拉刷新 ...

  3. NCreport报表控件教程:设计页眉和页脚

    一.设计页眉 一般来说页眉部分一般是用于包含标题的内容, 首先我们会添加列标签到页眉部分,标签都是简单的文本,标签项一般是用于在报表上显示一些描述信息,标签都是静态项,所以它们的值不会有变化. 添加标 ...

  4. phpcms V9 内容模型管理

    [1]理解模型 模型,系统知识的抽象表示.既然抽象了,那就得脑补一下.大家都是面向对象设计的专业人员,类就很抽象的,对比类的定义想象一下模型的概念. 举个例子,一般新闻类的信息,都具有标题.内容.作者 ...

  5. sql逻辑执行顺序

    要知道SQL语句,我想我们有必要知道SQL Server查询分析器怎么执行我们的SQL语句的,我们很多人会看执行计划,或者用Profiler来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查 ...

  6. Tween.js的使用示例

    可参考:http://www.htmleaf.com/jQuery/Layout-Interface/201501271284.html 官方文档:https://github.com/tweenjs ...

  7. iTunes

    我们的电脑都要下载比较好的显卡那项 https://support.apple.com/zh_CN/downloads/itunes

  8. 【转】The import javax.servlet cannot be resolved

    转载地址:http://www.2cto.com/kf/201212/176868.html 今天将别人的项目导入eclipse之后,出现了“The import javax.servlet cann ...

  9. 【转】破解Source Insight 3.5.0072过程 附:安装软件+注册机

    转载地址:http://blog.csdn.net/qs_hud/article/details/8884867 注册机及软件下载地址:http://download.csdn.net/detail/ ...

  10. 动态创建script在IE中缓存js文件时导致编码不正确bug

    $.each(scripts, function(){ if(!jsExist(this.src)){ var s = document.createElement("SCRIPT" ...