函数,对象,原型

函数:

1、定义式函数

function Person(){
    alert('Hello!');
}

Person();//Hello!

2、变量式函数 

var Person = function (){
 alert('Hello!');     
}
Person();//Hello!

3、

var Person = function (){
    alert('Lily');
}
Person();//第一次调用,显示Lily
Person = function (){
    alert('Bill');
}
Person();//第二次调用,显示Bill

 第一次调用之后,函数变量又被重新赋予新的函数体,第二次调用函数的时候,出现了不同的输出。以上代码给为下边代码

4、

function Person(){
    alert('Lily');
}
Person();//输出Bill
function Person(){
    alert('Bill');
}
Person();//输出Bill

两个命名一样的函数,在程序运行完后,你会发现,输出的都是最后一个函数值;第一个函数没起到作用;Javascript不是一行一行执行代码,而是一段一段,第一个函数会被最后执行的覆盖,所以两次调用都执行最后一个函数值。

对象:

任何一个函数都可以为其动态地添加或去除属性,这些属性可以是简单类型,可以是对象,也可以是其他函数;函数有对象的全部特征,可以说函数就是对象

function Person(){
    with(arguments.callee)
    alert(age);
}
Person.age = 22;
Person(); //显示22

Person函数被定以后,又增加了age属性。

1、创建一个没有任何属性的对象

var Person = {}

2、有数据的对象

  1)、创建一个有属性,初始值的对象

var Person = {name:'Lily',age:22};

  2)、创建一个有属性及方法的对象

var Person = {name:'Lily',age:22,sayHello:function(){alert('Hello')}};

alert(Person.name);//Lily

  3)、创建一个嵌套其他对象及数组的对象 

var company = {
    name:'Mic',
    employees:[
        {name:'Lily',age:22},
        {name:'Lucy',age:44}
    ]
};

alert(company.employees[0].name);//Lily

对象和函数可以象数组一样,用属性名或方法名作为下标来访问并处理 

 4)、

var Person = {};
Person.name = 'Lily';
Person.age = 22;
Person.sayHello = function (){
    alert("I'm  " +" " + this.name  + ' ' + this.age)
};

Person.sayHello();

创建了Person空对象,并设置name,age属性及sayHello方法;

构造函数: 

 1 function Person(name){
 2     this.name = name;//this对象name属性    
 3     this.sayHello = function (){ //给this对象创建sayHello方法
 4         alert("Hello I'm" + ' ' + this.name)
 5     }
 6 }
 7 function Employee(name, salary) {
 8   Person.call(this, name); //将this 传给父构造函数
 9   this.salary = salary; //设置一个this 的salary 属性
10   this.ShowMeTheMoney = function() {
11     alert(this.name + " $" + this.salary);
12   };
13   //添加ShowMeTheMoney 方法。
14 };
15 var oBill = new Person('Bill');//用Person构造函数创建oBill对象
16 var oLily = new Employee('Lily',1145); //用Empolyee 构造函数创建SteveJobs 对象
17 oBill.sayHello();//显示 Hello I'm Bill
18 oLily.sayHello();//显示 Hello I'm Lily
19 oLily.ShowMeTheMoney();//显示 Lily $1145

创造了一个带参数的构造函数Person,并把2行的name参数值赋值给this.name,并创建了sayHello方法,利用Person构造函数创建oBill对象;

7行的Employee函数将自己接受的this 作为参数调用Person构造函数;

oBill是由Person 构造的,oLily是由Employee构造的;

15\16行用Person和Empolyee创建基类的oBill和oLily对象;

我们还可以先定义一份唯一的方法函数体,并在构造this对象时使用它作为其方法,共享逻辑。如下:

 1 function sayHello(){ //先定义一份方法
 2     alert("Hello I'm" + ' ' + this.name)
 3 }
 4 
 5 function Person(name){
 6     this.name = name;//this对象name属性    
 7     this.sayHello = sayHello; //把2行中的sayHello方法的一堆代码复制给 this.sayHello
 8 }
 9 
10 var oBill = new Person('Bill');//用Person构造函数创建oBill对象
11 
12 oBill.sayHello();//显示 Hello I'm Bill

这样达到了共享的目的,还可以用prototype这个概念,如下:

原型:

1 function Person(name){
2     this.name = name;//设置对象属性,每个对象各自一份属性数据
3 }
4 Person.prototype.sayHello = function(){ //给Person 函数的prototype 添加SayHello 方法。
5     alert("Hello I'm" + ' ' + this.name)
6 }
7 var oBill = new Person('Bill');//创建oBill对象
8 
9 oBill.sayHello();//oBill 对象直接调用到SayHello 方法

构造函数 prototype上定义的方法可以通过对象直接调用,而且代码共享。逻辑上体现了方法和类的关系。来个复杂点的:

 1 function Person(name){//基类构造函数
 2     this.name = name;
 3 }
 4 
 5 function Employee(name, salary) {
 6   Person.call(this, name); //调用基类构造函数
 7   this.salary = salary; 
 8 };
 9  
10 Person.prototype.sayHello = function(){ //给基类构造函数的prototype 添加方法
11     alert("Hello I'm" + ' ' + this.name)
12 }
13 
14 Employee.prototype = new Person(); //建一个基类的对象作为子类原型的原型,这里很有意思
15 
16 Employee.prototype.ShowMeTheMoney = function() //给子类添构造函数的prototype 添加方法
17 {
18   alert(this.name + " $" + this.salary);
19 };
20 
21 var oBill = new Person('Bill');//创建基类Person oBill 对象
22 var oLily = new Employee('Lily',1145); //创建子类Employee 的oLily 对象
23 
24 oBill.sayHello();//通过对象直接调用到prototype 的方法
25 oLily.sayHello();//通过子类对象直接调用基类prototype 的方法,关注!
26 oLily.ShowMeTheMoney(); //通过子类对象直接调用子类prototype 的方法

继承:

闭包:

http://liuxiaofan.com/?p=1330#more-1330

posted @ 2013-05-23 18:01  纳闷儿  阅读(185)  评论(0编辑  收藏  举报