10. 实例属性、实例方法、类属性、类方法
* 每个对象都有它自己单独的实例属性的副本。我们说javas中的实例属性是那些在对象中用构造函数创建的或初始化的属性。
*
* 实例方法是由特定对象或实例调用的。实例方法使用了关键字this来引用它们要操作的对象或实例。虽然一个类的任何实例都可以调用实例方法,并不意味着每个对象都像实例属性那样含有自己专有的方法副本。相反,每个实例方法都是由类的所有实例共享的。在javascript中,给类定义一个实例方法,是通过把构造函数的原型对象中的一个属性设置为函数值来实现的。
* 这样,由那个构造函数创建的所有实例都会共享一个已继承的对函数的引用。
*
* 类属性表示在所有类实例中只有一个副本。在javascript中,类属性本质上就是全局变量。但是它们与一个类关联在一起,在javascript的名字空间中拥有一个逻辑位置,这样它们就不会被其他的同名属性覆盖。
* 如Circle.PI=3.14。虽然Circle是一个构造函数,但是由于javascript函数是对象,所以我们可以创建函数的属性,就像创建对象的属性一样。
*
* 类方法与类属性相似。在javascript中,要定义一个类方法,只需要用合适的函数作为构造函数的属性即可。
*/
11. 父类和子类
* 在javascript中,Object类所有类的父类,处于类层次图的最上层。所有的类都继承了Object类的所有方法。
*
* 我们已经学会了对象如何从它们构造函数的原型对象中继承属性,那么它们又是如何继承类Object的属性哪?我们知道,原型对象本身就是一个对象,它是由构造函数Object()创建的。
* 这就意味着原型对象继承了Object.prototype属性。因此,ret1会继承Rectangle.prototype的属性,还会继承Object.prototype的属性。整因为所有对象的prototype属性会继承Object.prototype属性,
* 所以所有javascript子类都继承了Object的所有属性,也即Object类是javascript的根类,处于类层次图的最顶层。
*/
12.使用[]读取和设置对象的属性
* 通常会采用点号运算符访问对象的属性,但是点号后面的属性是标识符。在javascript中,标识符必须逐字输入,它们不是一种数据类型。如果程序中属性是动态的、不确定的,那么我们将无法访问。
* 前面解释过,对象是一群属性的集合,也就是数组。那么可以使用数组访问成员的运算符[]来访问对象的属性。[]中是属性名称,是字符串类型,我们就可以动态的确定对象属性名称了。
*
* 使用[]运算符的对象我们也称之为关联数组。关联数组是一种数据结构,允许你动态地将任意值和任意字符串关联在一起。实际上,javascript对象在内部就是用关联数组实现的。使用点号运算符只是为了是他们看起来更像C++和Java的静态对象而已。
*
* 前面的for/in循环实际上是对数组的操作。
*
* 我们通常意义说的数组是将任何值和非负整数关联在一起的数据结构。
*
* 数组实际上是一个具有额外功能层的对象。如var a = new Array();window.alert(typeof a);输出Object。
*/
13. Object类的属性和方法
* constructor属性表示初始化该对象的构造函数。因此,可以使用该属性来判断对象的类型。
*/
function A(){return "aaaaaaaaa"};
var a = new A();
window.alert(a.constructor); //输出的是A的函数定义
window.alert(a.constructor==A); //结果是true
window.alert(a.constructor()); //输出aaaaaaaaaa
/**
* toString()方法没有任何实际参数,它返回的是一个字符串,该字符串代表了调用它的对象的类型或值。当javascript需要将一个对象转化成字符串时就调用这个对象的toString方法。
* 例如,当用运算符"+"把一个字符串和一个对象连接到一起时,或者把一个对象传递给alert()或document.write()方法时,就会调用toString()方法。
*/