《你必须知道的javascript(上)》- 2.this与对象原型

1.1 为什么使用this

随着你的使用模式越来越复杂,显式传递上下文对象会让代码变得越来越混乱,使用this则不会这样。当我们介绍对象和原型时,你就会明白函数可以自动引用合适的上下文对象有多重要。

1.2 关于误解

首先需要消除一些关于this的错误认识。

1.2.1 指向自身

先来看个例子:

        function foo(num) {
            console.log("foo: " + num);

            // 记录foo被调用的次数,这里this指向window
            this.count++;
        }

        foo.count = 0;

        var i;

        for (i = 0; i < 10; i++) {
            if (i > 5) {
                 foo(i);
            }
        }
        // foo: 6
        // foo: 7
        // foo: 8
        // foo: 9 

        // foo被调用了多少次?
        console.log(foo.count); // 0 -- WTF?

执行foo.count = 0时,的确向函数对象foo添加了一个属性count。但是函数内部代码this.count中的this并不是指向那个函数对象(指向全局变量 window),所以虽然属性名相同,根对象却并不相同,困惑随之产生。

如果要从函数对象内部引用它自身,那只使用this是不够的。一般来说你需要通过一个指向函数对象的词法标识符(变量)来引用它。

解决方法一:
一种解决方法是用词法作用域:

function foo(num) {
    console.log( "foo: " + num ); 

    // 记录foo被调用的次数
    data.count++;
} 

var data = {
    count: 0
}; 

解决方法二:
另一种解决方法是使用foo标识符替代this来引用函数对象:

function foo(num) {
    console.log( "foo: " + num ); 

    // 记录foo被调用的次数
    foo.count++;
}
foo.count=0; 

然而,这种方法同样回避了this的问题,并且完全依赖于变量foo的词法作用域。

重点:解决方法三:
另一种方法是强制this指向foo函数对象:

function foo(num) {
    console.log( "foo: " + num ); 

    // 记录foo被调用的次数
    // 注意,在当前的调用方式下(参见下方代码),this确实指向foo
    this.count++;
} 

foo.count = 0; 

var i; 

for (i=0; i<10; i++) {
    if (i > 5) {
        // 使用call(..)可以确保this指向函数对象foo本身
        foo.call( foo, i );
    }
}
// foo: 6
// foo: 7
// foo: 8
// foo: 9 

// foo被调用了多少次?
console.log( foo.count ); // 4

原文地址:https://www.cnblogs.com/tangge/p/11380139.html

时间: 2024-11-05 22:34:52

《你必须知道的javascript(上)》- 2.this与对象原型的相关文章

从零开始学习jQuery(剧场版) 你必须知道的javascript

原文:从零开始学习jQuery(剧场版) 你必须知道的javascript 一.摘要 本文是jQuery系列教程的剧场版, 即和jQuery这条主线无关, 主要介绍大家平时会忽略的一些javascript细节.  适合希望巩固javascript理论知识和基础知识的开发人员阅读.   二.前言 最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟.  其实我们容易忽视的javascrip

《jQuery风暴》第2章 必须知道的JavaScript知识

第2章 必须知道的JavaScript知识 JavaScript是jQuery应用的基础,掌握JavaScript这门语言是使用jQuery的基础条件.本章不会全面细致的讲解JavaScript的全部, 而是讲解其精髓,这些知识可以提升大家的JavaScript内功.切忌,要修炼上乘的武功,必须要有深厚的内功基础,否则只可学到其招式而发挥不了功力.JavaScript实际上包括三部分: w   ECMAScript 描述了该语言的语法和基本对象. w   DOM 描述了处理网页内容的方法和接口.

五个你必须知道的javascript和web debug技术

转:http://js8.in/2013/11/20/%E4%BA%94%E4%B8%AA%E4%BD%A0%E5%BF%85%E9%A1%BB%E7%9F%A5%E9%81%93%E7%9A%84javascript%E5%92%8Cweb-debug%E6%8A%80%E6%9C%AF/ 在前端开发中,调试技术是必不可少的技能,本文将介绍五种前端开发必备的调试技术. Weinre移动调试 DOM 断点 debugger断点 native方法hook 远程映射本地调试 Weinre 在移动上面

面向对象编程思想(前传)--你必须知道的javascript(转载)

原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 call apply band js中的闭包 什么是高阶函数 在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 javascript是一门典型的动态类型语

面向对象编程思想(前传)--你必须知道的javascript

什么是鸭子类型 javascript是一门典型的动态类型语言,也就弱类型语言.那什么是鸭子类型:[如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子] var 鸭子 = { 走路: function () { }, 咕咕咕: function () { } } var 鹦鹉 = { 走路: function () { }, 咕咕咕: function () { } } 这只鹦鹉同样有"走路"和"咕咕咕"的方法,那在js的世界里就可以把它当成鸭子.可以这样调用: v

细说Cocos2d-JS——你必须知道的JavaScript

对于使用游戏引擎开发游戏而言,你选择何种语言并不重要,重要的是你对这个游戏引擎的理解和掌握,你对开发游戏的实践和感悟,毕竟一种游戏引擎常常支持很多语言开发,不同的项目使用的语言也可能很不一样. --有些人说 这个观点确实不无道理,但是,我依旧认为,无论是对于Cocos2d还是Unity3d抑或是其他的游戏引擎,无论你选择的是C++,C#,Lua还是JavaScript,在对游戏引擎深入研究之前或者之外,对你所选语言的研究显得尤为重要.这可能会给你带来质的提升. 一.JavaScript--想说爱

10个你必须知道的jQueryMobile代码片段(转)

1.在列表项和按钮上禁用文本截断      如果你的列表项或者按钮上是一个很长的文本,它将会被jQuery Mobile自动截断,要禁用这个截断设置,需要在CSS选择器上添加属性"white-space:normal".例如,在按钮禁止截断:      .ui-btn-text{           white-space:normal;      }      在列表项上禁止截断:      .ui-li-desc{           white-space:norma;     

jQuery_review之使用jQuery的Ajax必须知道的,serialize、param方法以及全局函数

在项目中可能会碰到这样的几个问题: 第一个问题,我们需要实现一个基于ajax的异步程序,我们也相当的熟悉ajax中是可以通过{name:name,address:address}这种方式来进行传递参数的.但是,当任务下达的那一刻,我们发现前端的form表单非常的庞大,庞大的我没有耐心去一个一个的拼字符串. 第二个问题,我们需要将一个充满的checkbox的用户调查表传递给后台,额,难道需要我们写一个过滤器,然后通过each进行遍历,然后拼成这样的一个参数表么?如果你对jQuery的选择器比较了解

php必须知道的300个问题-目录

php必须知道的300个问题 第1章 PHP开发规范与入门要点 问题1 如何在Windows下配置PHP开发环境? 答案 问题2 如何在Linux下配置PHP开发环境? 问题3 如何搭建IIS+PHP+MySQL环境? 问题4 PHP集成开发环境的特点有哪些? 问题5 如何应用AppServ搭建PHP开发环境? 问题6 如何通过XAMPP配置PHP开发环境? 问题7 XAMPP——Linux版PHP集成化安装包 问题8 Apache配置文件全解 问题9 PHP.INI配置文件全解 问题10 Ap