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();     //

posted @ 2009-10-22 09:18  迷茫中的游魂  阅读(203)  评论(0编辑  收藏  举报