《JavaScript面向对象编程指南》读书笔记—Function

4.2.3 Function

函数是一种特殊的数据类型,它实际上是一种对象。

4.2.3.3 call( )和apply( )

1.在JavaScript中,每个函数都有call()和apply()两个方法。
这两个方法的两个功能:

(1)用他们来触发函数,并指定相关的调用参数。
(2)他可以让一个对象去“借用“另一个对象的方法,并为已所用。这也是非常简单而实用的代码重用。

2.通过一个例子来讲解call
(1)定义一个some_obj对象,该对象有一个say()方法:

var some_obj={
  name: ‘peichunyan‘,
  say: function(who){
     return ‘Haya‘ + who + ‘, I am ‘ + this.name;
  }
};

这样,就可以调用该对象的say( )方法了,并在其中使用this.name来访问其name属性了:
some_obj.say( ‘Kitty‘); //输出:Haya Kitty, I am peichunyan
(2)下面,我们再创建一个my_obj对象,它只有一个name属性:
var my_obj={ name: ‘LiYundi‘};
(3)对于my_obj,也想拥有和some_obj的say( )方法相同功能的方法,因此,我们希望将该方法当做my_obj自身的方法来调用(没必要自己再重复实现一遍)。在这样情况下,我们就可以试试say( )函数中的对象方法call( ):

some_obj.say.call(my_obj, ‘Yanglan‘);
//输出: "Haya Yanglan, I am LiYundi "

(4)解释:由于我们在调用say( )函数的对象方法call时传递了两个参数:对象my_obj和字符串"Yanglan”.这样一来,当say( )被调用时,其中的this就被自动设置成了my_obj对象的引用。因此我们看到,this.name返回的不再是“peichunyan”,而是“LiYundi”了。
(5)如果我们调用call方法时,需要传递更多的参数,可以在后面依次加入它们:
some_obj.someMethod.call(my_obj, ‘a‘, ‘b‘, ‘c‘);

  1. apply( )
    apply( )的工作方式与call( )基本相同,唯一的不同之处在于参数的传递形式,这里目标函数所需要的参数都是通过一个数组来传递。所以,下面两行代码的作用是等效的:
some_obj.someMethod.call(my_obj, ‘a‘, ‘b‘, ‘c‘);
some_obj.someMethod.apply(my_obj, [‘a‘, ‘b‘, ‘c‘]);

所以,对于之前的示例,也可以这样写:

some_obj.say.apply(my_obj, [ ‘Yanglan‘]);
//输出: "Haya Yanglan, I am LiYundi "

4.2.3.4重新认识arguments对象

1.可以在一个函数中通过arguments来访问传递给该函数所需的全部参数。栗子:

function f( ){
   return arguments;
}

f(1,2,3);   //[1,2,3]

2.尽管arguments看上去像是一个数组,但它实际上是一个类似数组的对象。它和数组相似是因为其中也包含了索引元素和length属性。但相似之处也就到此为止了,因为arguments不提供一些像sort()、slice()这样的数组方法。

  1. 但我们可以把arguments转换成数组,这样就可以对它使用各种各样的数组方法了。
    例子:
function f( ){
   var  args = [].slice.call( arguments);
  return args.reverse( );
}

f(1,2,3,4);       //[4,3,2,1]

这里的做法是:新建一个空数组,再使用它的slice属性。也可以用Array.prototype.slice来调用同一个函数。

4.2.3.5 推断对象类型

(1)问题:既然数组的typeof返回值也是“object”,那么要如何区分对象和数组呢?
(2)答案:使用Object对象的toString()方法。这个方法会返回所创建对象的内部类名。
(3)例:

Object.prototype.toString.call( { } );        // [object Object]
Object.prototype.toString.call( [ ] );        // [object Array]

在这里,toString()方法必须要来自于Object构造器的prototype属性。直接调用Array的toString()方法是不行的,因为在Array对象里,这个方法已经出于其它目的被重写了。
[1, 2, 3].toString( );

时间: 2024-10-14 07:12:48

《JavaScript面向对象编程指南》读书笔记—Function的相关文章

JavaScript面向对象编程指南——学习笔记1

第1章 引言 1.1 回顾历史 1.2 变革之风 1.3 分析现状 1.4 展望未来 1.5 面向对象的程序设计 1.5.1 对象(属性和方法的集合) 1.5.2 类 (相似对象的共同特征,如麻雀.老鹰都是鸟类) 1.5.3 封装 (将属性和方法集合起来,也有封闭作用域的概念,如封装一个播放器对象) 1.5.4 聚合 (将几个对象合并成一个对象) 1.5.5 继承 (一个实例对象继承父级对象的一些属性和方法) 1.5.6 多态 (一个对象调用其他对象的方法,call和apply) 1.6 OPP

《JavaScript面向对象编程指南》读书笔记②

概述 <JavaScript面向对象编程指南>读书笔记① 这里只记录一下我看JavaScript面向对象编程指南记录下的一些东西.那些简单的知识我没有记录,我只记录几个容易遗漏的或者精彩的知识点,以后再看也可当做拾遗之用! 内容 1.枚举属性用for-in循环显示. 2.当我们对对象的prorotype属性进行完全重写时,有可能会对对象constructor属性产生一定的负面影响. 3.uber--子对象访问父对象的方式Triangle.uber = TwoDShape.prototype 4

《JavaScript面向对象编程指南》读书笔记①

概述 JavaScript快忘完了,想看一本专业书拾遗,所以看了这本<JavaScript面向对象编程指南>. 个人觉得这本书讲的很透彻很易懂,一些原来有疑惑的地方在这本书里面豁然开朗,看起来非常爽! 现在我只记录一下我看这本书记录下的一些东西.那些简单的知识我没有记录,我只记录几个容易遗漏的或者精彩的知识点,以后再看也可当做拾遗之用! 记录 对象,方法,属性和类的通俗解释:对象往往是用名词来表示的(也被称为实例):方法一般都是些动词:属性值则往往是一些形容词:类就是相似对象的共同特征. 什么

JavaScript DOM编程艺术 读书笔记

3 DOM DOM分别指document,object和model. DOM中包含的节点主要分为三种:元素节点.文本节点和属性节点.DOM的原子是元素节点,标签的名字就是元素的名字,元素可以包含其他的元素.没有被包含在其他元素里的唯一元素是<html>元素,它是树节点的根元素:在XHTML文档里,文本节点总是被包含在元素节点的内部.但并非所有的元素节点都包含有文本节点:属性节点用来对元素做出更具体地描述. 有3种DOM方法可获取元素节点,分别是通过元素ID.通过标签名字和通过类名字来获取. 1

Javascript DOM 编程艺术读书笔记16/04/01

愚人节快乐 开始用webstorm了,随着学习深入,代码越来越长,因为不借助ide还真是挺难的 今天发现了一个严重的误区,text和textNode是完全不同的两个概念,之前没有特别注意,写代码很容易跳过createTextNode直接用parentNode.appendChild(text) 单独拎出来晒一晒,以后引以为戒 Javascript DOM 编程艺术读书笔记16/04/01

javaScript面向对象编程指南笔记

变量声明: var v1,v2 = 'hello',v3=42; javascript中的数据类型分两部分:基本类型(数字,字符串,布尔值,undefined,null)和对象类型. - 查看变量类型操作符 typeof 变量或数值 - 当一个数字以0开头时,就表示这是一个八进制数.0377 代表十进制数255  :0x前缀的是十六进制数 - Infinity  任何超出了javascript的数,除以0结果也是Infinity - 字符串用于算术运算时,会被当做数字类型使用.字符串 -> 数字

[已读]JavaScript面向对象编程指南

又是一个忽悠人的书名,其实这本书的花了大量内容阐述JS的基础语法,BOM,DOM,事件,ajax(这个和很多js书一样).最后一章则是编程模式与设计模式. 我觉得与面向对象没多大关系,要算的话,prototype与继承,它确实有提到,但是不多(要看继承,还是应该去看<javascript高级程序(第三版)>). 最后一章的设计模式不错,工厂模式.单例模式.装饰器模式与订阅者模式都讲得很详细. PS,这个作者还写过一本书叫<javascript模式>,已经很老了.

《JavaScript面向对象编程指南》译者序

相对于Perl.Python等动态脚本语言来说,JavaScript确实是一门饱受误解的语言.对于译者这种从20世纪90年代末走过来的C++程序员来说,尤其如此.在那个年代,提起JavaScript总是会让人联想起各种花哨的小玩意儿.令人讨厌的恶作剧.浏览器之间的恶斗(例如IE与Netscape)等令人不太愉快的场景.总而言之,我长期以来对JavaScript的评价基本上是比较负面的,认为那不过是一个旁门左道的.不务正业的玩具罢了. 但随着AJAX技术在21世纪最初10年里的爆炸性发展,人们突然

Javascript DOM 编程艺术读书笔记16/03/26

更新时间 2016-03-27 01:14:15 外设javascript文件操作的标准模板归纳 javascript不需要事件必须在HTML文档处理,可以在外部javascript的文件把一个事件添加到HTML的某个元素上 element.event = atciotn 关键是如何把这个元素确定下来,这个问题类似css,可以用class或者id 如果把某个事件添加到某个确定id的元素上,可以用getElementById() document.getElementById("id")