Javascript 学习总结2
javascript函数可以动态的添加或去除属性,属性可以是简单类型,对象、函数。
对象或函数可以将属性名作为下表,以数组的形式访问,还可以通过如下形式遍历一个函数或对象的属性。
for(var s in aObject)
alert(s+" is a "+typeof(aObject[s]));
for(var s in aFunction)
alert(s+" is a "+typeof(aFunction[s]));
Javascript 中的this对象和其他面向对象语言中的this(self,me)对象有所不同,不一定指函数本身所述对象,只是指它当前服务的对象。在Javascript中可以通过Call和Apply将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象。
apply(thisArg,argArray)
call(thisArg[,arg1,arg2...]) 函数内部的this会被赋值为thisArg
Javascript的所有function都有一个prototype属性,这个属性本身是一个object类型的对象,通过prototype属性添加的任意属性和方法,从function生成的对象都可以访问,可以看作类的静态属性和方法。
1 function Person(name) //基类构造函数
2 {
3 this.name = name;
4 };
5
6 Person.prototype.SayHello = function() //给基类构造函数的prototype添加方法
7 {
8 alert("Hello, I'm " + this.name);
9 };
10
11 function Employee(name, salary) //子类构造函数
12 {
13 Person.call(this, name); //调用基类构造函数
14 this.salary = salary;
15 };
16
17 Employee.prototype = new Person(); //建一个基类的对象作为子类原型的原型,这里很有意思
18
19 Employee.prototype.ShowMeTheMoney = function() //给子类添构造函数的prototype添加方法
20 {
21 alert(this.name + " $" + this.salary);
22 };
23
24 var BillGates = new Person("Bill Gates"); //创建基类Person的BillGates对象
25 var SteveJobs = new Employee("Steve Jobs", 1234); //创建子类Employee的SteveJobs对象
26
27 BillGates.SayHello(); //通过对象直接调用到prototype的方法
28 SteveJobs.SayHello(); //通过子类对象直接调用基类prototype的方法,关注!
29 SteveJobs.ShowMeTheMoney(); //通过子类对象直接调用子类prototype的方法
30
31 alert(BillGates.SayHello == SteveJobs.SayHello); //显示:true,表明prototype的方法是共享的
这段代码的第17行,构造了一个基类的对象,并将其设为子类构造函数的prototype,这是很有意思的。这样做的目的就是为了第28行,通过子类对象也可以直接调用基类prototype的方法。为什么可以这样呢? 原来,在JavaScript中,prototype不但能让对象共享自己财富,而且prototype还有寻根问祖的天性,从而使得先辈们的遗产可以代代相传。当从一个对象那里读取属性或调用方法时,如果该对象自身不存在这样的属性或方法,就会去自己关联的prototype对象那里寻找;如果prototype没有,又会去prototype自己关联的前辈prototype那里寻找,直到找到或追溯过程结束为止。
Javascript通过prototype定义的属性可以给子对象继承,子对象可以自定义同名属性覆盖 prototype定义的属性,但对象还是可以通过类(函数)名.prototype.属性来调用。
function Person(name)
{
this.name = name;
};
Person.prototype.company = "Microsoft"; //原型的属性
Person.prototype.SayHello = function() //原型的方法
{
alert("Hello, I'm " + this.name + " of " + this.company);
};
var BillGates = new Person("Bill Gates");
BillGates.SayHello(); //由于继承了原型的东西,规规矩矩输出:Hello, I'm Bill Gates
var SteveJobs = new Person("Steve Jobs");
SteveJobs.company = "Apple"; //设置自己的company属性,掩盖了原型的company属性
SteveJobs.SayHello = function() //实现了自己的SayHello方法,掩盖了原型的SayHello方法
{
alert("Hi, " + this.name + " like " + this.company + ", ha ha ha ");
};
SteveJobs.SayHello(); //都是自己覆盖的属性和方法,输出:Hi, Steve Jobs like Apple, ha ha ha
BillGates.SayHello(); //SteveJobs的覆盖没有影响原型对象,BillGates还是按老样子输出
Person.prototype.SayHello(); //