JavaScript入门之对象与JSON(1)(2)
原型对象
原型(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对象:
对象的声明有三种方式:
◆ 通过new操作符作用域Object对象,构造一个新的对象,然后动态的添加属性,从无到有的构筑一个对象。
◆ 定义对象的“类”:原型,然后使用new操作符来批量的构筑新的对象。
◆ 使用JSON,这个在下一节来进行详细说明
这一节我们详细说明第二种方式,如:
- //定义一个"类",Address
- function Address(street, xno){
- this.street = street || 'Huang Quan Road';
- this.xno = xno || 135;
- this.toString = function(){
- return "street : " + this.street + ", No : " + this.xno;
- }
- }
- //定义另一个"类",Person
- function Person (name, age, addr) {
- this.name = name || 'unknown';
- this.age = age;
- this.addr = addr || new Address(null, null);
- this.getName = function () {return this.name;}
- this.getAge = function(){return this.age;}
- this.getAddr = function(){return this.addr.toString();}
- }
- //通过new操作符来创建两个对象,注意,这两个对象是相互独立的实体
- var jack = new Person('jack', 26, new Address('Qing Hai Road', 123));
- var abruzzi = new Person('abruzzi', 26);
- //查看结果
- print(jack.getName());
- print(jack.getAge());
- print(jack.getAddr());
- print(abruzzi.getName());
- print(abruzzi.getAge());
- print(abruzzi.getAddr());
运行结果如下:
jack
26
street : Qing Hai Road, No : 123
abruzzi
26
street : Huang Quan Road, No : 135






