javascript学习总结

1. js中的函数

1.1 函数定义的方法有三种

第一种:

function box(num1, num2){

            return num1 + num2;        

        }

第二种:

        var box = function(num1, num2){

            return num1 + num2;

        }

第三种:

        var box = new Function('num1', 'num2', 'return num1+num2;');

那么函数到底是什么呢?

我们可以alert(box) 打印出的函数整个声明

alert(typeof box); 打印出的是 function ,表明是一个fucntion 对象。

2. applay 和 call

是每一个函数所拥有的两个方法,使用他们可以扩充函数的执行作用与。

同时每一个函数内部可以应用的内置对象由:this和arguments,第一个代表函数执行的作用与。第二个是函数的参数。

函数也是对象,所以函数也有属性和方法。每一个函数都包含两个属性:

length 和 prototype 。其中length标识函数希望接受的命名参数的个数。

prototype 属性,保存苏偶有实例方法。prototype有两个方法 apply 和call

3. 在js中如何创建一个对象

3.1 直接使用 new Object

var obj = new Object();

obj.name = "jack";

obj.age = 19;

obj.sayHello = function(){

    alert("hello i'am " + this.name);

}

这种做法虽然可以,但是当我们要创建大量的相同类型的对象时,就要写相同的代码,服用性非常差。

3.2 使用工厂方法:

function createObject(name, age){

    var obj = new Object();

    obj.name = name;

    obj.age = age;

    obj.sayHello = function(){

    alert("hello i'am " + this.name);

    }

    return obj;

}

此时我们就可以使用这种方法,创建大量的相同对象,但是,存在一个问题,就是 这样创建的对象,无法进行类型识别。他们都是Object类型。所以在实际使用中非常不安全。

3.3 构造函数

function User(name, age){

    this.name = name;

    this.age = age;

    this.sayHello = function(){

    alert("hello i'am " + this.name);

    }

}

上面的函数和工厂方法的代码非常相似,但是,他没有 new Object,而是直接使用this。这中函数就是构造函数,他的使用方法是:

var user = new User('tom', 19);

同时我们可以使用 instanceof user 来识别其类型:是 User.

所以使用构造函数可以对对象进行类型识别。

但是,这种方法同样存在一个问题,就是对于sayHello函数,每一个new出来的对象都有一份sayHello函数的拷贝。这样就造成大量内存的浪费。所以我们这种方法还有待改进

3.4 使用全局函数来改进对象函数

function User(name, age){

    this.name = name;

    this.age = age;

    this.sayHello = sayHello;

}

function sayHello(){

    alert("hello i'am " + this.name);

}

这样的话,对于每一个new出来的对象。sayHello函数都只有唯一的一份拷贝,节省了内存。但是这样做还是存在一个问题。就是sayHello函数也可以当作全局函数直接被使用,当其被直接使用是,this指针就是执行window域。其行为是未定义的,不可知的。其实从对象封装的角度触发,这样的方法是破坏了对象的封装,所以这种方法也不行。

posted @ 2015-07-19 15:38  a ray of sunshine  阅读(130)  评论(0编辑  收藏  举报