[b]一、对象[/b]
1.Js中所有东西都是对象(除了原始值)

true, 123, 'abc', undefined, {} //null和数组也是对象




2.可以用点取对象的属性的值或设对象的属性值。


这个属性就像是对象的指针,而属性是这个指针的名字,名字可以任意取



var obj.abc = "abc";
	var obj['abc'] = "abc";




3.所有对象都有一个隐藏的属性__proto__。


原型链就根据这个隐藏属性来的,这个属性可以在firefox和chrome调试中看到,正常写js代码时是不会直接使用这个属性的


var obj.__proto__.abc = "aaa";
	alert(obj.abc);            //obj.abc   ==>  obj.__proto__.abc="aaa"



4.在读取对象的某一个属性值的时候,会首先查找对象本身是否有该属性,如果找到则返回对应的值,否则查找这个对象的__proto__是否有该属性。由于__proto__也是一个对象,所以本条规则对__proto__也适用,直到对象的__proto__的值为null,则说明属性不存在,返回undefined,其过程如下:


function getValue(obj, attribute){
		while(obj != null){
			var value = obj$attribute;//伪代码,找自身对应的属性
			if(value){
				return value;
			}
			obj = obj.__proto__;
		}
		return undefined;
	}




5.只有取属性值的时候才会查找原型链,设置属性值的时候不通过原型链查找。




[b]二、函数[/b]


1.函数也是对象,为和普通对象区分,我们叫它函数对象


function func(){}   ==> var func = new Function("");




2.既然函数是对象。那么函数也有对象的性质,也可以用点给函数对象设置属性值或读取值,也有__proto__属性


func.abc = 'abc';




3.函数对象有一个prototype属性,这个属性是函数对象天生就有的,有特殊功能。


一般情况下,ptototype属性就是一个普通对象,具有前面普通对象的所有特性,其特殊功能继续往后看


func.prototype.abc = 'bbb';





[b]三、创建对象[/b]


1.使用函数对象创建普通对象,即new出一个“实例”


function Person(name){
		this.name = name;
	}
	Person.prototype.sayHello = function(){
		alert(this.name + " say: Hello world!");
	}
	var p1 = new Person("Habo");
	p1.sayHello();




2.其实使用new根据构造函数创建一个对象时,等价于下面三步(不考虑构造函数有返回值的情况)


var p2 = {};
	Person.call(p2, "Habo");
	p2.__proto__ = Person.prototype;




3.由上面三步中看出,在用一个构造函数new出一个对象时,会将这个新对象的原型链指针(__proto__)指向构造函数的prototype,这就是prototype的特殊功能了,除了这个功能prototype就是一个普通对象。


这样的话,所以:


p1.sayHello ==> p1.__proto__.sayHello ==> Person.prototype.sayHello





[b]四、继承[/b]


1.js中本没有继承的概念,只不过根据js的一些特性实现具有继承“父类”属性的效果。


function Student(id){
		this.id = id;
	}
	Student.prototype = new Person();





2.实现方式无外乎两种:a.将“父类”的属性挂到“子类”的原型链上 b.将“父类”的属性复制给“子类”