原文:http://zn.net.cn/NewsView.aspx?id=89
对象的分类
所谓对象查找,即在一段可执行代码的作用域内,找到一个当前需要的对象。在javascript中,需要进行查找的对象大致可以分为3种类型:
1、变量查找,如foo++;,这里就会去查找一个叫作foo的变量。
2、属性查找,如foo.bar++;,这里会去查找foo这个变量下的一个叫作bar的属性。
3、this查找,即针对this关键字的处理。
变量的查找
当确定一个对象的查找为变量查找后,可以按照变量查找的规则来查看。
变量查找,即在作用域链上进行查找,作用域链是javascript非常着名的2条链之一,以下代码体现一个标准的作用域链。变量的查找可以简单地遵守“从下向上”的原则,即:
1、在函数c的范围内查找foo和bar,显然在c里面并没有foo和bar的声明,查找失败。
2、在包含c的函数,即函数b的范围内查找foo和bar,可以看到b里面只有对foo的赋值,并没有声明,查找失败。
3、在包括b的函数,即函数a的范围内查找foo和bar,可以找到bar的声明,因此确定bar为2。
4、由于a不被任何函数包含,那么就在全局作用域内查找foo,发现有foo的声明,因此确定foo的值为1。但是由于在函数b中,对这个foo有赋值,所以foo的值被修改为3。
5、完确定foo的值为3,bar的值为2,因此输出"3,2"。
总结一下,变量的查找是延着作用域链进行的,作用域链可以简单地看成函数间的包含关系,被包含的函数中不存在某个变量时,在包含他的函数中查找,直到全局作用域。
属性的查找
当确定一个对象的查找为属性查找后,可以按照属性查找的规则来查看。
属性查找,即在原型链上进行查找,原型链是javascript双链的另一条,属性查找是一个不断寻找prototype的过程,即:
1、查找c.prototype中,有没有显示定义foo和和bar,发现定义了foo,其值为3。
2、发现c.prototype就是new b()得到的对象,那么查找b.prototype中,有没有显示定义bar,发现定义了,其值为2。
3、因此确定foo的值为3,bar的值为2,输出"3,2"。
总结一下,属性查找是延着原型链进行的,原型链的具体知识这里不作详细解释,可以另找文章进行参考。所有的对象,其原型链最终会是Object.prototype。
this的查找
智囊网络深圳网站建设认为,this的查找是很多人迷茫的一点,也似乎有很多人抱有this不稳定这样的看法,实在令人无语。this的查找可以说是3种对象查找中最为简单的,因为其实this对象的确定根本没有一个“查找”的过程。
首先,this对象只会在一个函数中需要确定,如果是在全局域下,this永远为Global对象,在浏览器中通常就是window对象。而在javascript中,函数的调用一共有4种方式:
Function Invocation Pattern:诸如`foo()`的调用形式被称为Function Invocation Pattern,是函数最直接的使用形式,注意这里的foo是作为单独的变量出现,而不是属性。在这种模式下,foo函数体中的this永远为Global对象,在浏览器中就是window对象。
Method Invocation Pattern:诸如`foo.bar()`的调用形式被称为Method Invocation Pattern,注意其特点是被调用的函数作为一个对象的属性出现,必然会有“.”或者“[]”这样的关键符号。在这种模式下,bar函数体中的this永远为“.”或“[”前的那个对象,如上例中就一定是foo对象。
Constructor Pattern:`new foo()`这种形式的调用被称为Constructor Pattern,其关键字`new`就很能说明问题,非常容易识别。在这种模式下,foo函数内部的this永远是new foo()返回的对象。
Apply Pattern:`foo.call(thisObject)`和`foo.apply(thisObject)`的形式被称为Apply Pattern,使用了内置的`call`和`apply`函数。在这种模式下,`call`和`apply`的第一个参数就是foo函数体内的this,如果thisObject是`null`或`undefined`,那么会变成Global对象。
应用以上4种方式,确定一个函数是使用什么样的Pattern进行调用的,就能很容易确定this是什么。另外,this是永远不会延作用域链或原型链出现一个“查找”的过程的,只会在函数调用时就完全确认。
关于Javascript是继SQL Server 存储过程之后又一心的知识,接下来关于这方面的知识会增加一些介绍和实用的一些方法。
分享到:
相关推荐
在JavaScript中,数组和对象是两种非常基础且重要的数据结构,它们被广泛应用于各种场景,如数据存储、逻辑处理和对象表示。这篇文章将深入探讨这两种数据类型,以及相关的操作和工具。 **一、数组** 数组在...
面向对象编程(OOP)是一种软件开发方法,它通过将数据和处理这些数据的方法捆绑在一起形成“对象”来组织代码。这种编程方式使得代码更加模块化,易于管理和扩展。OOP的核心概念包括类、对象、继承、封装、多态等。 ...
JavaScript是Web开发中不可或缺的一部分,它是一种轻量级的、解释型的编程语言,主要应用于浏览器端,用于实现动态交互的网页。JavaScript的核心对象构成了其基础框架,它们提供了丰富的功能,使得开发者能够处理...
当尝试访问对象的一个属性时,JavaScript会首先在当前对象中查找,如果找不到,就会沿着原型链向上查找,直到找到为止。 4. **继承**:JavaScript支持多种继承方式,如原型链继承、构造函数继承、组合继承、原型式...
原型(prototype)是JavaScript中实现继承的关键,每个函数都有一个prototype属性,这个属性指向一个对象,该对象的属性和方法会被实例继承。当你创建一个新对象时,如果没有指定构造函数,那么这个新对象就会从...
JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和动态应用程序时不可或...通过阅读和实践这些案例,你可以逐步掌握如何创建、继承和操作JavaScript对象,从而成为一名更出色的JavaScript开发者。
面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一种重要编程范式,它允许开发者创建复杂的、可复用的代码结构。在本“JavaScript面向对象编程”主题中,我们将深入探讨这一概念及其在JavaScript...
原型链是JavaScript中对象查找机制的核心概念。当尝试访问一个对象的属性时,如果该对象本身没有定义该属性,则JavaScript引擎会沿着该对象的原型链向上查找,直至找到该属性为止。 每个JavaScript对象都有一个内部...
它有多种方法来执行各种操作,如查找子字符串(`indexOf()`), 替换内容(`replace()`), 字符串转大写(`toUpperCase()`)或小写(`toLowerCase()`), 以及将字符串转换为数组(`split()`). - `Date`对象:日期对象用于...
面向对象编程(Object-Oriented Programming,OOP)是编程中的一个重要概念,JavaScript也支持面向对象的特性,尽管它并非一种传统的面向对象语言。在这个“JavaScript面向对象基础”的资料中,我们将会探讨...
JavaScript中的每个对象都有一个指向其原型对象的内部链接,当试图访问一个对象的属性时,如果在当前对象上找不到该属性,解释器会继续在原型对象上查找,这个过程会一直持续到找到该属性或到达原型链的末端。...
由于所有的JavaScript对象都继承自全局对象Object,因此,任何对象都可以调用其他对象的方法,这就实现了多态性。 5. 原型和原型链 在JavaScript中,对象都有一个特殊的内部属性[[Prototype]],通常通过__proto__或...
- **原型链**:每个JavaScript对象都有一个原型对象,这个原型对象也有一个原型,以此类推,形成一个链状结构。当试图访问一个对象的属性时,JavaScript引擎会沿着这个原型链查找,直到找到该属性为止。 ```...
通过原型链,对象可以访问其原型上的属性和方法,形成一个连续的对象查找链。 7. **对象字面量和属性访问**:JavaScript提供了简洁的语法来创建和访问对象的属性,如`var obj = {name: 'John', age: 30}`,通过`.`...
在JavaScript中,对象可以直接创建,无需预先声明类,而且对象的属性和方法可以在运行时动态添加或修改。 **基于静态类的特性** 1. **类与实例**:在基于类的编程中,类是一个模板,用于创建具有相同结构和行为的...
2. **JavaScript对象** 在JavaScript中,一切皆为对象。核心对象如全局对象、Math对象、Date对象、String对象、Array对象等,提供了丰富的内置方法来处理各种操作。例如,Math对象包含各种数学函数,如圆周率π...
JavaScript是一种支持两种主要编程范式的语言:函数式和面向对象(OOP)。在JavaScript中,面向对象编程基于原型,这使得它与其他面向对象语言(如Java或C++)有所不同。以下是对JavaScript面向对象和原型机制的详细...
数组是另一种重要的JavaScript对象,用于存储一系列按顺序排列的数据项: - 创建数组:`var arr = new Array();` 或者 `var arr = [1, 2, 3];` - 访问元素:`arr[0]`, `arr[1]`等。 - `length`: 获取数组的长度。 -...