JSON

对象与 JSON

字号+ 作者:H5之家 来源:H5之家 2017-03-13 12:00 我要评论( )

JavaScript对象与传统的面向对象中的对象几乎没有相似之处,传统的面向对象语言中,创建一个对象必须先有对象的模板:...

对象与 JSON

JavaScript 对象与传统的面向对象中的对象几乎没有相似之处,传统的面向对象语言中,创建一个对象必须先有对象的模板:类,类中定义了对象的属性和操作这些属性的方法。通过实例化来构筑一个对象,然后使用对象间的协作来完成一项功能,通过功能的集合来完成整个工程。而 Javascript 中是没有类的概念的,借助 JavaScript 的动态性,我们完全可以创建一个空的对象(而不是类),通过像对象动态的添加属性来完善对象的功能。

JSON 是 JavaScript 中对象的字面量,是对象的表示方法,通过使用 JSON,可以减少中间变量,使代码的结构更加清晰,也更加直观。使用 JSON,可以动态的构建对象,而不必通过类来进行实例化,大大的提高了编码的效 率。

对象

JavaScript 对象其实就是属性的集合,这里的集合与数学上的集合是等价的,即具有确定性,无序性和互异性,也就是说,给定一个 JavaScript 对象,我们可以明确的知道一个属性是不是这个对象的属性,对象中的属性是无序的,并且是各不相同的(如果有同名的,则后声明的覆盖先声明的)。

一般来说,我们声明对象的时候对象往往只是一个空的集合,不包含任何的属性,通过不断的添加属性,使得该对象成为一个有完整功能的对象,而不用通过创建一个类,然后实例化该类这种模式,这样我们的代码具有更高的灵活性,我们可以任意的增删对象的属性。

如果读者有 Python 或其他类似的动态语言的经验,就可以更好的理解 JavaScript 的对象,JavaScript 对象的本身就是一个字典(dictionary),或者 Java 语言中的 Map,或者称为关联数组,即通过键来关联一个对象,这个对象本身又可以是一个对象,根据此定义,我们可以知道 JavaScript 对象可以表示任意复杂的数据结构。

对象的属性

属性是由键值对组成的,即属性的名字和属性的值。属性的名字是一个字符串,而值可以为任意的 JavaScript 对象(JavaScript 中的一切皆对象,包括函数)。比如,声明一个对象:

var jack = new Object(); jack.name = "jack"; jack.age = 26; jack.birthday = new Date(1984, 4, 5); //声明另一个对象 var address = new Object(); address.street = "Huang Quan Road"; address.xno = "135"; //将addr属性赋值为对象address jack.addr = address;

这种声明对象的方式与传统的 OO 语言是截然不同的,它给了我们极大的灵活性来定制一个对象的行为。

对象属性的读取方式是通过点操作符(.)来进行的,比如上例中 jack 对象的 addr 属性,可以通过下列方式取得:

var ja = jack.addr; ja = jack[addr];

后者是为了避免这种情况,设想对象有一个属性本身包含一个点(.),这在 JavaScript 中是合法的,比如说名字为 foo.bar,当使用 jack.foo.bar 的时候,解释器会误以为 foo 属性下有一个 bar 的字段,因此可以使用 jack[foo.bar]来进行访问。通常来说,我们在开发通用的工具包时,应该对用户可能的输入不做任何假设,通过[属性名]这种形式则总是可以保证正确性的。

属性与变量

在第二章,我们讲解了变量的概念,在本章中,读者可能已经注意到,这二者的行为非常相似,事实上,对象的属性和我们之前所说的变量其实是一回事。

JavaScript 引擎在初始化时,会构建一个全局对象,在客户端环境中,这个全局对象即为window。如果在其他的JavaScript 环境中需要引用这个全局对象,只需要在顶级作用域(即所有函数声明之外的作用域)中声明:

var global = this;

我们在顶级作用域中声明的变量将作为全局对象的属性被保存,从这一点上来看,变量其实就是属性。比如,在客户端,经常会出现这样的代码:

var v = "global"; var array = ["hello", "world"]; function func(id){ var element = document.getElementById(id); //对elemen做一些操作 }

事实上相当于:

window.v = "global"; window.array = ["hello", "world"]; window.func = function(id){ var element = document.getElementById(id); //对elemen做一些操作 } 原型对象

原型(prototype),是 JavaScript 特有的一个概念,通过使用原型,JavaScript 可以建立其传统 OO 语言中的继承,从而体现对象的层次关系。JavaScript 本身是基于原型的,每个对象都有一个 prototype 的属性来,这个 prototype 本身也是一个对象,因此它本身也可以有自己的原型,这样就构成了一个链结构。 访问一个属性的时候,解析器需要从下向上的遍历这个链结构,直到遇到该属性,则返回属性对应的值,或者遇到原型为 null 的对象(JavaScript 的基对象 Object 的 prototype 属性即为 null),如果此对象仍没有该属性,则返回 undefined. 下面我们看一个具体的例子:

//声明一个对象base function Base(name){ this.name = name; this.getName = function(){ return this.name; } } //声明一个对象child function Child(id){ this.id = id; this.getId = function(){ return this.id; } } //将child的原型指向一个新的base对象 Child.prototype = new Base("base"); //实例化一个child对象 var c1 = new Child("child"); //c1本身具有getId方法 print(c1.getId()); //由于c1从原型链上"继承"到了getName方法,因此可以访问 print(c1.getName());

得出结果:

child base

由于遍历原型链的时候,是有下而上的,所以最先遇到的属性值最先返回,通过这种机制可以完成重载的机制。

this 指针

JavaScript 中最容易使人迷惑的恐怕就数 this 指针了,this 指针在传统 OO 语言中,是在类中声明的,表示对象本身,而在 JavaScript 中,this 表示当前上下文,即调用者的引用。这里我们可以来看一个常见的例子:

//定义一个人,名字为jack var jack = { name : "jack", age : 26 } //定义另一个人,名字为abruzzi var abruzzi = { name : "abruzzi", age : 26 } //定义一个全局的函数对象 function printName(){ return this.name; } //设置printName的上下文为jack, 此时的this为jack print(printName.call(jack)); //设置printName的上下文为abruzzi,此时的this为abruzzi print(printName.call(abruzzi));

运行结果:

jack Abruzzi

应该注意的是,this 的值并非函数如何被声明而确定,而是被函数如何被调用而确定,这一点与传统的面向对象语言截然不同,call 是 Function 上的一个函数,详细描述在第四章。

使用对象

对象是 JavaScript 的基础,我们使用 JavaScript 来完成编程工作就是通过使用对象来体现的,这一小节通过一些例子来学习如何使用 JavaScript 对象:

对象的声明有三种方式:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Java JSON技术框架选型、测试及简单使用

    Java JSON技术框架选型、测试及简单使用

    2017-03-11 13:02

  • 浅谈javascript的url参数parse和build函数

    浅谈javascript的url参数parse和build函数

    2017-03-10 12:04

  • 解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    2017-03-07 10:23

  • 使用Cookie和JSON记录用户最近浏览历史

    使用Cookie和JSON记录用户最近浏览历史

    2017-03-01 17:02

网友点评