1. 前言

为什么将这三个概念放在一起说。原因是这些是会在实现js 继承会需要使用到的

2. call 和 apply

call 和 apply 的作用基本类似, 都是去执行function并将这个function 的context替换成第一个参数带入。 两者的不同是call 必须将function 的参数一一带入,而 apply  只要在第二个参数带入一个数列。
  1. function fn( arg1, arg2,... ){
  2. // do something
  3. }
  4. fn( arg1, arg2,... );
  5. fn.call( context, arg1, arg2,... );
  6. fn.apply( context, [ arg1, arg2,... ]);

手册的解释:
===================================
call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

参数
thisObj
可选项。将被用作当前对象的对象。

arg1, arg2,  , argN
可选项。将被传递方法参数序列。

说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
=====================================

  1. <!--by oscar999 2013-1-17-->
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>Insert title here</title>
  7. </head>
  8. <body>
  9. <script>
  10. var func=new function(){this.a="func"}
  11. var newfunc=function(x){
  12. var a="newfunc";
  13. alert(this.a);
  14. alert(x);
  15. }
  16. newfunc.call(func,"inputParameter1");
  17. /*alert are
  18. * func/inputParameter1; not newfunc/inputParameter1
  19. */
  20. </script>
  21. </body>
  22. </html>

从以上的例子可以看出, alert(this.a), 返回的是并不是当前函数里的值。

使用call 执行的速度会稍微快一些, 不过差异不大。

3.prototype

JavaScript没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承。
prototype 其实就是构造函数的一个属性。
所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。
实例对象一旦创建,将自动引用prototype对象的属性和方法。也就是说,实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。

  1. function Person(name){
  2. this.name = name;
  3. this.gender = "male";
  4. }
  5. var person1 = new Person("MM");
  6. var person2 = new Person("YY");
  7. person1.gender = "female";
  8. alert(person2.gender);// male
  9. </script>
  1. <script>
  2. function Person(name){
  3. this.name = name;
  4. }
  5. Person.prototype.gender = "female";
  6. var person1 = new Person("MM");
  7. var person2 = new Person("YY");
  8. alert(person2.gender);// male
  9. </script>

比较以上两个例子就知道了。

4. 参考

http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

JavaScript 之call , apply 和prototype 介绍的更多相关文章

  1. JavaScript中call,apply和prototype

    [TOC] call()方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 如果没有提供 thi ...

  2. javascript call与apply关键字的作用

    apply接受两个参数.第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合. call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数. 1 2 3 4 ...

  3. 《JavaScript总结》apply、call和bind方法

    在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...

  4. Java程序猿的JavaScript学习笔记(5——prototype和Object内置方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. 深入了解JavaScript中基于原型(prototype)的继承机制

    原型 前言 继承是面向对象编程中相当重要的一个概念,它对帮助代码复用起到了很大的作用. 正文 Brendan Eich在创建JavaScript时,没有选择当时最流行的类继承机制,而是借鉴Self,用 ...

  6. js继承之call,apply和prototype随谈

    在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...

  7. javascript中call,apply,bind的用法对比分析

    这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们.   关于call,apply,bind这三个函数的用法,是学习java ...

  8. 转---- javascript prototype介绍的文章

    JavaScript是基于对象的,任何元素都可以看成对象.然而,类型和对象是不同的.本文中,我们除了讨论类型和对象的一些特点之外,更重要的是研究如何写出好的并且利于重用的类型.毕竟,JavaScrip ...

  9. JavaScript中的apply()方法和call()方法使用介绍

    1.每个函数都包含两个非继承而来的方法:apply()和call(). 2.他们的用途相同,都是在特定的作用域中调用函数. 3.接收参数方面不同,apply()接收两个参数,一个是函数运行的作用域(t ...

随机推荐

  1. zookeeper篇-如何修改源码

    提一个问题先 zxid有64位,分成两部分: 高32位是Leader的epoch:选举时钟,每次选出新的Leader,epoch累加1 低32位是在这轮epoch内的事务id:对于用户的每一次更新操作 ...

  2. java开源类库pinyin4j的使用

    最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使 ...

  3. air for android 使用ANE来获取安卓手机IMEI号

    一首页创建一个ANE文件 1 使用FlashBuilder 或者Eclipse 创建一个新的android项目     A 创建文件Extension.java package com.dabing. ...

  4. Python 爬虫-Requests库入门

    2017-07-25 10:38:30 response = requests.get(url, params=None, **kwargs) url : 拟获取页面的url链接∙ params :  ...

  5. mount: unknown filesystem type 'LVM2_member'解决方案【转】

    一台服务器,普通/dev/sda1/2(硬盘一) 同步数据到 lvm_member(硬盘二) rsync两硬盘数据同步: From: http://hi.baidu.com/williwill/ite ...

  6. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  7. .split(",", -1);和.split(",")的区别

    .split(",", -1);和.split(",")的区别在于://eg:String a="河南省,,金水区".//a.split(& ...

  8. Leetcode 73

    class Solution { public: void setZeroes(vector<vector<int>>& matrix) { vector<vec ...

  9. Adaboost入门教程——最通俗易懂的原理介绍(图文实例)

    https://blog.csdn.net/px_528/article/details/72963977 写在前面 说到Adaboost,公式与代码网上到处都有,<统计学习方法>里面有详 ...

  10. java并发编程:线程安全管理类--原子操作类--AtomicReference<V>

    1.类 AtomicReference<V> public class AtomicReference<V>extends Objectimplements Serializa ...