廖雪峰的官方网站《JavaScript教程-方法》个人总结

3.3、方法

//定义对象
var xiaoming = {
    name:"小明",
    brith:1990
}
//给对象绑定一个函数
var xiaoming = {
    name:"小明",
    brith:1990,
    age:function(){
        var y = new Date().getFullYear();
        return y-this.brith;
    }
}
//function
xiaoming.age;
//26
xiaoming.age();

在一个方法内部,this是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。所以,this.birth可以拿到xiaoming的birth属性。

function getAge() {
    var y = new Date().getFullYear();
    return y - this.brith;
}
//定义对象
var xiaoming = {
    name: "小明",
    brith: 1990
}
//给对象绑定一个函数
var xiaoming = {
    name: "小明",
    brith: 1990,
    age:getAge
}
//function
xiaoming.age;
//26
xiaoming.age();

单独调用函数getAge()怎么返回了NaN?请注意,我们已经进入到了JavaScript的一个大坑里。

JavaScript的函数内部如果调用了this,那么这个this到底指向谁?

答案是,视情况而定!

如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的对象,也就是xiaoming,这是符合我们预期的。

如果单独调用函数,比如getAge(),此时,该函数的this指向全局对象,也就是window。

()

也是不行的!要保证this指向正确,必须用obj.xxx()的形式调用!

fn = xiaoming.fn()

由于这是一个巨大的设计错误,要想纠正可没那么简单。ECMA决定,在strict模式下让函数的this指向undefined,因此,在strict模式下,你会得到一个错误:

结果又报错了!原因是this指针只在age方法的函数内指向xiaoming,在函数内部定义的函数,this又指向undefined了!(在非strict模式下,它重新指向全局对象window!)

xiaoming = {
    : : :(){
        (){
            year = Date().()year - .}
        ()}
}
xiaoming.()

修复的办法也不是没有,我们用一个that变量首先捕获this

xiaoming = {
    : : :(){
        that = (){
            year = Date().()year - that.}
        ()}
}
xiaoming.()

var that = this;,你就可以放心地在方法内部定义其他函数,而不是把所有语句都堆到一个方法中。

apply

虽然在一个独立的函数调用中,根据是否是strict模式,this指向undefinedwindow,不过,我们还是可以控制this的指向的!

要指定函数的this指向哪个对象,可以用函数本身的apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。

apply修复getAge()调用:

(){
    Date().() - .}
xiaoming = {
    : : :}
xiaoming.().(xiaoming,[])

另一个与apply()类似的方法是call(),唯一区别是:

  • apply()把参数打包成Array再传入;
  • call()把参数按顺序传入。

比如调用Math.max(3, 5, 4),分别用apply()call()实现如下:

..([])..()

对普通函数调用,我们通常把this绑定为null

装饰器

利用apply(),我们还可以动态改变函数的行为。

JavaScript的所有对象都是动态的,即使内置的函数,我们也可以重新指向新的函数。

现在假定我们想统计一下代码一共调用了多少次parseInt(),可以把所有的调用都找出来,然后手动加上count += 1,不过这样做太傻了。最佳方案是用我们自己的函数替换掉默认的parseInt()

count = oldParseInt = .= (){
    count++oldParseInt.(arguments)}
(())(())(())(count)
时间: 2024-10-07 23:19:26

廖雪峰的官方网站《JavaScript教程-方法》个人总结的相关文章

[python学习篇][廖雪峰][1]高级特性--创建生成器 方法1 a = (x for x in range(1,3))

创建一个生成器的方法: for x in range(1,10000000) ,先生成一个列表[1........9999999] 如果我们只想要后面的几个元素,会发现浪费很多空间.所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间.在Python中,这种一边循环一边计算的机制,称为生成器(Generator). 要创建一个generator,有很多种方法.第一种方法很简单,只要把一个列表生成式的[]改

Python教程-廖雪峰 学习第一天 2015-03-28

本人是刚大学毕业不久,在一家IT公司工作,平时接触到Python比较多,一些程序的脚本.提高工作效率的工具以及自动化等,都是用Python编写出来的.不断地接触使我发现Python语言是在工作中占据了大部分,但是我却不会自己编写,略感有些遗憾!所以决定自己开始接触这门语言. 在网上看到了好多的Python语言教程,感觉每个教程都有自己的特色,最后决定使用廖雪峰老师官方网站的Python教程,在此对廖雪峰老师表示感谢! 第一天: 1.Python是什么?一门编程语言 2.学习Python做什么?让

值得学习的技术人——廖雪峰

廖雪峰,技术作家,<Spring 2.0核心技术与最佳实践>作者,业务马拉松选手. 廖雪峰的官方网站,尤其是Python教程,流量巨大,帮助了不少入门的新人. 原文地址:https://www.cnblogs.com/doit8791/p/9552157.html

20200225 Java 多线程(1)-廖雪峰

Java 多线程(1)-廖雪峰 多线程基础 进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程. 操作系统调度的最小任务单位其实不是进程,而是线程.常用的Windows.Linux等操作系统都采用抢占式多任务,如何调度线程完全由操作系统决定,程序自己不能决定什么时候执行,以及执行多长时间. Java语言内置了多线程支持:一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程.此外,JVM还有负责垃

廖雪峰js教程学习——操作表单

# 廖雪峰js教程学习记录——操作表单 # 用JavaScript操作表单和操作DOM是类似的,因为表单本身也是DOM树. 用JavaScript来操作表单,可以获得用户输入的内容,或者对一个输入框设置新的内容. HTML表单的输入控件主要有以下几种: - 文本框,对应的`<input type="text">`,用于输入文本: - 口令框,对应的`<input type="password">`,用于输入口令: - 单选框,对应的`<

廖雪峰的Python3教程: 章节1,章节2,章节3

目录 廖雪峰的Python3教程: 章节1,章节2,章节3 1 python简介 2 安装Python 2-1 Python解释器 3 第一个Python程序 3-1 使用文本编辑器 3-2 Python代码运行助手 3-3 输入和输出 廖雪峰的Python3教程: 章节1,章节2,章节3 教程地址 1 python简介 Python是著名的"龟叔"Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言,解释型语言,高级语言. Python提供

我的git学习记录------------从廖雪峰老师网站的学习总结

这篇文章只用作自我学习,部分参考来自廖雪峰老师网站 mkdir 路径/文件名(d:/test)  创建文件夹 cd  路径/文件名(cd d:/test)  进入文件夹 pwd   显示当前所出位置的路径   确保全英路径(注意) cd 仓库(repository)文件路径       eg(cd d:/test) git init   初始化空的仓库,把这个目录变成git可以管理的仓库 编写一个readme.txt文件,内容如下: Git is a version control system

python语言特性-------python2.7教程学习【廖雪峰版】(一)

开始学习廖雪峰的py2.7教程: 2017年6月5日12:54:28 笔记: 廖雪峰python2.7教程1.用任何编程语言来开发程序,都是为了让计算机干活.  2.Python是一种相当高级的语言.代码少还不好?代码少的代价是运行速度慢.3.用Python可以做什么?可以做日常任务,比如自动备份你的MP3:可以做网站,很多著名的网站包括YouTube就是Python写的:可以做网络游戏的后台,很多在线游戏的后台都是Python开发的.4.Python的哲学就是简单优雅,尽量写容易看明白的代码,

廖雪峰Git教程学习笔记

廖雪峰git简单教程学习笔记 教程地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0001.可以这样设计目录,在d:\reposisoty\ 在这个目录下面有很多的仓库.mkdir learngitcd learngit>>git init          #这样就把learngit 初始化成了一个仓库>>git status        #说明当前仓库的状态并