标签:
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域。其行为是未定义的,不可知的。其实从对象封装的角度触发,这样的方法是破坏了对象的封装,所以这种方法也不行。
标签:
原文地址:http://www.cnblogs.com/a-ray-of-sunshine/p/4658712.html