js学习笔记——理解javascript的对象与继承

 

最近一直在看《JavaScriptDOM高级程序设计》这本书,现将js的对象与继承这部分整理如下。

 

对象:
什么是对象?要理解对象,就要知道什么是类。类就是一些事物的集合,对象就是一个具体的事物,而对于这个对象的描述就是它的属性。
人是一个类,你跟我都是对象,名字身高就是我们的一个属性。电器是一个类,冰箱跟洗衣机都是对象,价格与品牌就是它们的一个属性。

 

而在JavaScript中一切(从函数到字符)都是对象,它是包含一组变量(属性)和函数(方法)的集合(类)的实例。如果是懂得OO(Object Oriented)思想的人一定都很好理解这句话。

 

JavaScript是一种原型式(prototype-style)的OO语言,它不是强语言(这跟JAVA不一样),因为设计它时就是作为一门应景的脚本语言来的,

所以没有引入类的概念,所有的一切都是继承(这个概念后面会说)自现有对象的一个副本。

 

JavaScript中大多数对象可以分为两种:
1、 Function对象,例如alert()函数,可以使用参数改变功能

alert('argument');

2、Object对象,

var obj = new Object();
obj('argument');//会报错,因为obj不是Function对象

Object 是通用基础对象,可以使用它来创建简单的静态对象。
Function 是被所有使用参数的对象复制的对象,也是在脚本中定义函数时所创建的对象。

 

其他常用内置对象:Array,String、Boolean、Number,Math、Date、RegExp……

 

所有内置对象都可以通过new关键字或者其他特殊的语法来创建,例如function关键字用于创建Function对象,花括号({})是Object的简写形式,而方括号([])则是Array的简写形式。
它们的共同特点是提供一组属性和方法,以便根据每个对象的设计用途通过不同方式来操纵这些对象。

 

 

 

继承:

因为Javascript里面都是对象,必须有一种机制,将所有对象联系起来。所以,此语言的设计者,网景公司的工程师 Brendan Eich虽然不打算将“类”这个概念引入这门语言之中,但还是设计了“继承”。

对象继承是面向对象编程的一个重要组成部分,而在JS中,继承是通过简单地从一个对象原型向另一个对象原型复制方法来实现的。并非传统语言中从一个类扩展出另一个类的底层类结构。


js中创建实例的方法:

var myObject = new Object();//new 关键字
var myObject = {};//简写语法


无论通过哪种方式,最终的myObject变量都是Object对象的一个实例。而所实例化的对象都必须是一个构造函数。实际上Object、Function、Array、String等都是含有构造函数的。
Array对象实际上就是继承自Object,并且添加了额外的属性(如length)和方法而已。


构造函数是什么?举个例:

function Car(name) {
  this.name = name;
}
var bmw = new Car('宝马');//注意,使用new的时候,在创建bmw实例的时候已经运行了一次Car函数
alert(bmw.name);//弹出宝马

 

但是用构造函数生成实例对象,有一个缺点,就是无法共享属性和方法,每一个实例的创建实际上都是生成一个此函数的副本。
比如:

function Car(name) {
this.name = name;
this.price = '100w';
}
var bmw = new Car('宝马');
var daben = new Car('奔驰');
daben.price = '200W';
alert(bmw.price);//显示‘100w’,不受daben的影响。
【并且:var myBmw = new bmw(); 这行代码是无法运行的,因为bmw已经是一个实例了,所以在实例上创建实例的操作是无效的】。

 

所以想在实例化对象时使其包含公有方法怎么办?

Brendan Eich决定为构造函数设计一个prototype属性。
这个属性包含一个对象(简称“prototype对象”),所有实例对象需要共享的属性方法都在其中,不需要共享的就放在构造函数中。
实例一旦创建,就自动引用prototype对象的属性和方法。可以说,实例对象的属性和方法,一种本地的,一种是引用的。
对于所有prototype对象的修改,所有继承了此对象的对象与它们所有的实例都会立即继承同样的变化。
现在以Car函数为例,用prototype属性进行改写,添加一个公共属性:

function Car(name) {
this.name = name;
}
Car.prototype = {price:'150w'};//注入属性的一种方法

var bmw = new Car('宝马');
var daben = new Car('奔驰');

alert(bmw.price);//150w
alert(daben.price);//150w

Car.prototype.price = '170w';//注入属性的一种方法
alert(bmw.price);//170w
alert(daben.price);//170w

//price属性放在了prototype对象中,是两个实例共享的。所以只要修改了prototype对象,就会同时影响到两个实例。

 

由于所有实例对象都共享同一个prototype对象,那么从外界看来,prototype对象就好像是实例对象的原型。而实例对象继承了prototype对象一样。

这便是Javascript继承机制的设计思想了。

注:prototype继承只能实现单继承。不过可以使用对象冒充的方法,使用call()、apply()等函数来实现多继承。

posted @ 2012-03-27 15:10  ~羽  阅读(297)  评论(0编辑  收藏  举报