You Don't Know JS: this & Object Prototypes( 第一章 this or That?)

Foreword

this 关键字和prototypes

他们是用JS编程的基础。没有他们创建复杂的JS程序是不可能的。

我敢说大量的web developers从没有建立过JS Object,仅仅对待这门语言作为一个事件绑定胶水,在按钮和Ajax请求之间。

我也曾是他们的一员,但是当我了解到如何掌握prototypes并创建JS对象,一个世界的可能性对我打开了。



Chapter 1: this Or That?

this作为一个识别符号关键字自动定义在每个函数的作用域中,但是它究竟涉及什么,甚至困扰着有经验的JS developer。


Why this?

既然很难理解,为什么还使用?它的麻烦大于它的价值吗?

看案例:

function identify() {
    return this.name.toUpperCase();
}

var me = {
    name: "Kyle"
};
var you = {
	name: "Reader"
}; 
identify.call( me ); // KYLE
identify.call( you ); // READER

这段代码让identify函数被多次调用。

如果不用this关键字,也可以通过传入一个context对象来实现:

function identify(context) {
    return context.name.toUpperCase();
}
identify( you ); // READER

由此可见,this机制提供了更优雅的方式,暗示传入了一个对象,这让API设计更清晰,复用更容易。


Confusions

首先,消除一些错误观念。常常有2个错误的假设:

Itself

假设this是函数自身。

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

    // keep track of how many times `foo` is called
    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

// how many times was `foo` called?
console.log( foo.count ); // 0 -- WTF?因为this指向了window对象。this指向的是调用函数的对象。
//在call方法内加上函数对象的identifier名字
for (var i=0; i<10; i++) {
    if (i > 5) {
        foo.call( foo, i );
    }
}

// how many times was `foo` called?
console.log( foo.count ); // 4

除此之外,还有规避this的方法。但都没有直面this到底是什么的问题。

  • 使用foo.count代替this.count.
  • 单独声明一个data对象{ count: 0},用于计数 data.count++

Its Scope

另一个常见的误区是关于this,它涉及了函数的作用域。这里有些诡计:

在某些情况下是对的,但在其他情况下,这么理解是受到误导的!

this关键字,在任何时候,都不涉及一个function的 Lexical scope

function foo() {
    var a = 2;
    this.bar();
}

function bar() {
    console.log( this.a );
}

foo(); //undefined

写 这段代码的人,试图通过this关键字,把变量a传递给bar函数。以为this是桥梁,能在两个函数的lexical scope之间传递内部变量a。 ?。没有这个桥梁!!

this不能得到foo函数的Lexical scope!!

this和Lexical scope是不相关的!!!


What‘s this?

this机制到底是如何工作的?

this和函数调用的方式相关!

当一个函数被invoked,一条记录被创建。这条记录包含信息:

  • 函数从哪里调用(the call-stack)
  • 函数如何被invoked
  • 什么参数被传入。

这条记录的属性之一就是 this 引用。它会在函数的执行期间被使用。

下一章,我们会学习寻找一个函数的call-site(调用点),来决定它的执行如何绑定this关键字

Review

this既不是函数自身的引用也不是函数的lexical作用域的引用!!

this实际是一个在函数被invoked时创建的绑定binding!!!

this引用什么由函数被调用的地点call-site决定!!!

You Don't Know JS: this & Object Prototypes( 第一章 this or That?)

原文地址:https://www.cnblogs.com/chentianwei/p/9743606.html

时间: 2024-11-05 18:54:51

You Don't Know JS: this & Object Prototypes( 第一章 this or That?)的相关文章

You Don&#39;t Know JS: this &amp; Object Prototypes( 第2章 this)

this is a binding made for each function invocation, based entirely on its call-site (how the function is called). this是为函数被引用而创建的绑定!完全地基于函数如何被调用/函数的call-site! Call-site :the location in code where a function is called call-stack: 调用函数的堆栈.(函数的调用链条,函数

You Don&#39;t Know JS: this &amp; Object Prototypes( 第3章 this和Object Prototypes)

前2章探索了this绑定指向不同的对象需要函数引用的call-site. 但是什么是对象,为什么我们需要指向它们? 本章探索细节. Syntax Type Build-in 对象 Contents Computed Property Names Property vs. Method Arrays Duplicating Objects Property Descriptors Writable Configurable Enumerable Immutability不变 Object Cons

阅读《js是设计模式》第一章心得

1.明白自己 明白了自己写的代码为什么难懂且臃肿,不方便阅读且效率低.最主要的是为什么整套流程下来只能我一个人写,因为这样的代码根本没有团队力,协同能力差.对js理解的不过透彻. 2.真正的学会对象与类的区别 类 :对一群具有相同特征的对象的集合的描述:对象:真实存在的对象个体: 比如人类,指的是一个范围: 对象:比如某个人,指的是这个范围中具体的对象. Javascript中的function作为构造函数时,就是一个类,搭配上new操作符,可以返回一个对象.当然,要生成一个对象,也可以用字面量

JS的Object漫想:从现象到“本质”

转自:http://zzy603.iteye.com/blog/973649 写的挺好,用于记录,把对象分成概念的Object(var f={})和 类的Object(function F(){}) ------------------------------------- 前言 首先,要说明的我是一个计算机爱好者,但我并不是科班出身,也没有受过专业的培训,所以,有些专业名词可能用的不当或者看法偏激乃至错误,敬请谅解并给予斧正为盼. 一.Object是什么? 刚开始我简单地认为Object是js

JS查看Object对象的内容

以一个例子来说,下面是他的Object: JS: 如果想直接获取到total的值,那就先把获取到的Json先Eval(),然后json.total就能取到total的值了, 但是如果想取到rows里面的值呢,我们先得进去rows,那就应该是:json.rows,但是我们alert的时候发现,这个rows有三个参数,我们要取第一个的话,那就应该是json.rows[0],然后再取 里面的strUserName或者strUserPwd就应该是Json.rows[0].strUserName了. 假设

JS与Object-C交互补充

有一个场景,用户点击Web页面,产生JS交互时,如何根据JS事件,App做出响应. 我们可以自己做一个简单的js交互,实现基于的原理是: 1. object-c利用stringByEvaluatingJavaScriptFromString:(NSString *)script消息获取uiwebview页面数据. 2. 那么如何监控特定的js事件呢?UIWebViewDelegate的(BOOL)webView:shouldStartLoadWithRequest:navigationType:

JS 对象(Object)和字符串(String)互转

JS 对象(Object)和字符串(String)互转 [javascript] view plaincopy var jsObj = {}; jsObj.testArray = [1,2,3,4,5]; jsObj.name = 'CSS3'; jsObj.date = '8 May, 2011'; var str = JSON.stringify(jsObj); alert(str); 从JSON字符串转为对象 [javascript] view plaincopy var jsObj = 

js 之 object

js之object 对象 ECMA-262 把对象(object)定义为"属性的无序集合,每个属性存放一个原始值.对象或函数".严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScript 如此定义对象,但它更通用的定义是基于代码的名词(人.地点或事物)的表示. 类 每个对象都由类定义,可以把类看做对象的配方.类不仅要定义对象的接口(interface)(开发者访问的属性和方法),还要定义对象的内部工作(使属性和方法发挥作用的代码).编译器和解释程序都根据类的说明构建对象

JS高级程序设计(1-3章笔记)

第一章    JavaScript简介 1.1    JavaScript简史 1995.02- 公司:Netscape 主要人物:就职于Netscape的Brendan Eich(布兰登.艾奇) 事件:为Netscape Navigator 2开发一种名为LiveScript的脚本语言 1995.02-前夕 公司:Netscape 事件:临时将LiveScript改名为JavaScript 1995.02+ JavaScript1.0获得巨大成功 1996.08 公司:微软 IE3加入名为JS