javaer 2012-07-19
这几天一直在学习javascript,脑子里面被各个书籍的概念充斥,比较混乱,现在整理一下。
要理解javascript面向对象,首先必须理解js的function.在js中,函数的本质是对象,也就是说函数是function类型的实例,根据这里理解,函数名只是指向函数对象的指针而已(根据这个我们很好理解,javascript的函数没有重载的概念)。
1.函数声明:
function sum(a,b){
return a+b;
}
2.函数表达式:
var sum = function(a,b){
return a+b;
}
3.function构造函数:
var sum = new Function("a","b","return a+b");
三种方式的区别是:函数声明式在代码执行前被解析器添加到执行环境中,也就是函数声明可以放在调用代码之后。其他两者则不一样。构造函数方法,影响性能,因为有两次解析,一次式解析常规,另一次式对传入构造函数的字符串解析。
由于函数名式一个变量所以函数既可以当作参数,也可以当作函数的返回值。
函数的属性和方法
(1)内部特殊属性
arguments:一个类数组对象,保存着传入函数的所有参数。这个对象还有一个特殊的属性callee ,该属性是一个指针,指向拥有这个argumnets的函数。
function f(){
fi(num<=1){
return 1;
}else{
return num*arguments.callee(num-1)
}
}
this:函数体内部的this对象指向调用此函数的对象。
leng:希望接受的参数个数,也就是函数定义的参数个数。
property:--。
apply():在特定的作用域中条用函数,实际上等于设置函数体内的this值。
call():与上类是,不同的是apply有两个参数,一个是作用域,另一个是数组或argumnets。而call,参数不限定,而且参数直接传递给函数。
bind():ejs5定义的方法。这个方法会创建一个函数的新实例,并且this会被设置为传入bind()参数的值。
(2)一般属性
由于function也是对象,所以函数也有方法和属性。
定义在function内的属性是无法直接外部访问的。但是在外面创建的属性相当与函数的静态方法跟属性
/////////////////////// function test(){ var tt ='1'; function getTT(){ console.log(tt); }; } test.log=function(){ console.log('this is the static method'); } test.svar='static variable'; console.log(test.svar); test.log();
二。对象
1.对象的创建
js对象的创建从本质上分为两种方法:
(1).根据object创建对象。
不管是new object对象还是字面量,或者工才厂模式,其本质都是返回一个object实例。
这种方式有一个比较重大的问题是 无法知道对象的具体类型。 也就是说只能typeof ==object.
(2).根据function创建对象。(也就是构造函数模式)
示例如下:
////////// function Person(name,age,job){ this.name=name; this.job = job; this.sayName=function(){ alert(this.name); }; } var person = new Person("liuxiang","23","soft");
构造函数的函数名首字母大写(本质上没有这个规定,只是一种不成文的规定,方便区别构造函数跟普通函数)。