??xml version="1.0" encoding="utf-8" standalone="yes"?>
* 对象是一U复合数据类型,它们多个数据值集中在一个单元中Q而且q行使用名字来存取这些倹{解释对象的另一U方式是Q对象是一个无序的属性集合,每个属性都有自q名字和倹{存储在对象中的已命名的值可以是数字和字W串q样的原始|也可以是对象?br />*/
var o = new Object();
2.对象直接量创建对?
* 对象直接量由属性说明列表构成,列表包含在大括号中,其中的属性说明由逗号隔开?br />* 对象直接量中的每个属性说明都由属性名加上冒号和属性值构成?br />*/
var zhangsan = {name:”zhangsan”, age:34, married:true};
window.alert(typeof zhangsan); //输出object
3.属性的d和设|?br />* 对象的属性通过点号q算W读取和讄。对象的新属性可以通过直接创徏?br />*/
window.alert(zhangsan.car); //输出undefined
zhangsan.car=”BMW”; //直接赋?br />window.alert(zhangsan.car); //输出BMW
4.属性的枚D
* 通过for循环枚D每一个属性,序不能保证固定?br />* 注意枚D出的是属性名Uͼq不是属性倹{?br />*/
var values = “”;
for(var v in zhangsan)values += v+”\n”; //枚D每一个属?br />window.alert(values);
5.属性的删除使用deleteQ如delete zhangsan.car
*/
6.构造函?
* 构造函数是h两个Ҏ的javascript函数Q?br />* (1)它由new q算W调用;
* (2)传递给它的是一个对新创建的I对象的应用Q将该引用作为关键字this的|而且它还要对新创建的对象q行适当的初始化?br />* CQ构造函数只是初始化对象Qƈ不返回新创徏的对象?br />*/
function Rectangle(w, h){
this.width = w;
this.height = h;
}
var ret1 = new Rectangle(2, 1);
//注意构造函数是如何使用它的参数来初始化this关键字所引用的对象的属?/p>
7.对象的方?
* 所谓方法,是通过对象调用的javascript函数。我们知道,函数是数|它们所使用的名字没有Q何特D之处,可以函数赋lQ何变量,甚至赋给一个对象的M属性,那么q个属性就是对象的Ҏ了?br />* 在对象的Ҏ体内Q关键字this的值就成了调用该方法的对象?br />*/
function print(){}
ret1.print = print;
8.关于this的讨?br />* M一个用作方法的函数都会得到一个额外的实际参数Q即调用该函数的对象。由于方法通常是对那个对象执行某种操作Q所以要表达函数作用于对象这一事实Q最好采用方法的调用语法?br />* 如rect.setSize(width, height);
* setSize(rect, width, height);
* 虽然q两行代码对对象rect执行相同的操作,但是W一行代码在表达对象rect是操作的焦点(或者说操作的目?q一观点时显然清楚得多?br />*
* 虽然有区别地对待函数和方法比较有用,但实际上它们之间的差别ƈ不大。回忆一下,函数是存储在变量中的|而那个变量也不过是全局对象的一个属性。因此,当你调用一个函数时Q实际上调用的是全局对象的一个方法?br />* 在这L函数中,关键字this引用的是全局对象。所以函数和Ҏ之间在技术上没有差别Q真正的差别在于设计和目的上Q方法是用来对this对象q行操作的,而函数通常会是独立的,q不需要用this对象?br />*/
(function f(){
var values = “”;
for(var v in this)values += v + ” “;
window.alert(values);
})(); //q回window对象的所有属性和Ҏ名称
9.原型对象和?br />* javascript每个对象都有原型对象Q每个对象都l承原型对象的所有属性?br />* 一个对象的原型是由创徏q初始化该对象的构造函数定义的。javascript中的所有函数都有prototype属性,它引用了一个对象。虽然原型对象初始化时是I的Q?br />* 但是你在其中定义的Q何属性都会被该构造函数创建的所有对象ѝ?br />*
* 构造函数定义了对象的类Qƈ初始化了cM状态变量的属性,如width和height。因为原型对象和构造函数关联在一P所以类的每个成员都从原型对象承了相同的属性?br />* q说明原型对象是存放Ҏ和其他常量属性的理想场所?br />
* 注意Q承是在查询一个属性值时自动发生的。属性ƈ非从原型对象复制到新的对象的Q它们只不过看v来像是那些对象的属性。这其中有两炚w要的含义?br />* 一是用原型对象可以大量减每个对象对内存的需求量Q因为对象可以承许多属性。二是即使属性在对象被创Z后才d到它的原型对象中Q对象也能够l承q些属性?br />*
* 每个c都有一个原型对象,q个原型对象都具有一套属性。但是实际上却有大量的类实例Q每个实例都能承原型对象的属性。由于一个原型对象能够被多个对象l承Q所以javascript
* 必须强化d属性g间的不对U性。在d象o的属性pӞjavas会首先检查o是否h一个名为p的属性。如果o没有q个属性,javascript׃再检查o的原型对象是否具有这个属性。这h使得以原型ؓ基础的承机制v作用?br />*
* 但是当写一个属性的值时Qjavascriptq不会检查原型对象中是否有这个属性的倹{因为,如果允许改变原型对象的这一属性,那就改变了整个对象类的p|包括其他new出来的对象变量的属性倹{?br />*
* 因此Q属性的l承只发生在d性值时Q而不会发生在写属性值时。如果你讄的对象o的属性p是对象o从它的原型对象承而来的,那么l果是你直接在对象o中创Z一个新属性p。现在o已经有了一个自q名ؓp的属性,它就不会再从它的原型对象l承p的g。当你读p的值时Qjava首先查询o的属性?br />* ׃它发Co中定义的pQ就不必再查询原型对象,也就不会再发现原型对象中定义的pg。我们称之ؓo中的p”遮蔽”了或者说”隐藏”了原型对象中的属性p?br />*
* 因ؓ原型对象的属性被一个类的所有对象共享,所以通常只用它们来定义类中所有对象的相同的属性。这使得原型对象适用于方法定义和帔R的定义?br />*/
10. 实例属性、实例方法、类属性、类Ҏ
* 每个对象都有它自己单独的实例属性的副本。我们说javas中的实例属性是那些在对象中用构造函数创建的或初始化的属性?br />*
* 实例Ҏ是由特定对象或实例调用的。实例方法用了关键字this来引用它们要操作的对象或实例。虽然一个类的Q何实例都可以调用实例ҎQƈ不意味着每个对象都像实例属性那样含有自׃有的Ҏ副本。相反,每个实例Ҏ都是q的所有实例共享的。在javascript中,l类定义一个实例方法,是通过把构造函数的原型对象中的一个属性设|ؓ函数值来实现的?br />* q样Q由那个构造函数创建的所有实例都会共享一个已l承的对函数的引用?br />*
* cd性表C在所有类实例中只有一个副本。在javascript中,cd性本质上是全局变量。但是它们与一个类兌在一P在javascript的名字空间中拥有一个逻辑位置Q这样它们就不会被其他的同名属性覆盖?br />* 如Circle.PI=3.14。虽然Circle是一个构造函敎ͼ但是׃javascript函数是对象,所以我们可以创建函数的属性,像创徏对象的属性一栗?br />*
* cL法与cd性相伹{在javascript中,要定义一个类ҎQ只需要用合适的函数作ؓ构造函数的属性即可?br />*/
11. 父类和子c?
* 在javascript中,ObjectcL有类的父c,处于cdơ图的最上层。所有的c都l承了Objectcȝ所有方法?br />*
* 我们已经学会了对象如何从它们构造函数的原型对象中承属性,那么它们又是如何l承cObject的属性哪Q我们知道,原型对象本n是一个对象,它是由构造函数Object()创徏的?br />* q就意味着原型对象l承了Object.prototype属性。因此,ret1会承Rectangle.prototype的属性,q会l承Object.prototype的属性。整因ؓ所有对象的prototype属性会l承Object.prototype属性,
* 所以所有javascript子类都承了Object的所有属性,也即ObjectcLjavascript的根c,处于cdơ图的最层?br />*/
12.使用[]d和设|对象的属?
* 通常会采用点可符讉K对象的属性,但是点号后面的属性是标识W。在javascript中,标识W必逐字输入Q它们不是一U数据类型。如果程序中属性是动态的、不定的,那么我们无法访问?br />* 前面解释q,对象是一属性的集合Q也是数组。那么可以用数l访问成员的q算W[]来访问对象的属性。[]中是属性名Uͼ是字W串cdQ我们就可以动态的定对象属性名UC?br />*
* 使用[]q算W的对象我们也称之ؓ兌数组。关联数l是一U数据结构,允许你动态地Q意值和L字符串关联在一赗实际上Qjavascript对象在内部就是用兌数组实现的。用点可符只是Z是他们看h更像C++和Java的静态对象而已?br />*
* 前面的for/in循环实际上是Ҏl的操作?br />*
* 我们通常意义说的数组是将M值和非负整数兌在一L数据l构?br />*
* 数组实际上是一个具有额外功能层的对象。如var a = new Array();window.alert(typeof a);输出Object?br />*/
13. Objectcȝ属性和Ҏ
* constructor属性表C初始化该对象的构造函数。因此,可以使用该属性来判断对象的类型?br />*/
function A(){return “aaaaaaaaa”};
var a = new A();
window.alert(a.constructor); //输出的是A的函数定?br />window.alert(a.constructor==A); //l果是true
window.alert(a.constructor()); //输出aaaaaaaaaa
/**
* toString()Ҏ没有M实际参数Q它q回的是一个字W串Q该字符串代表了调用它的对象的类型或倹{当javascript需要将一个对象{化成字符串时p用这个对象的toStringҎ?br />* 例如Q当用运符”+”把一个字W串和一个对象连接到一hQ或者把一个对象传递给alert()或document.write()ҎӞ׃调用toString()Ҏ?br />*/