JavaScript构造函数

来源:互联网 发布:网络云台控制软件 编辑:程序博客网 时间:2024/06/05 14:46

普通函数和构造函数的区别

在命名规则上,构造函数一般是首字母大写,普通函数遵照小驼峰式命名法。

在函数调用的时候:

function fn() { }

     构造函数:1. new fn( )
                     2 .构造函数内部会创建一个新的对象,即f的实例
                     3. 函数内部的this指向 新创建的f的实例
                     4. 默认的返回值是f的实例

     普通函数:1. fn( )
                     2. 在调用函数的内部不会创建新的对象
                     3. 函数内部的this指向调用函数的对象(如果没有对象调用,默认是window)
                     4. 返回值由return语句决定 

 构造函数的返回值:

     有一个默认的返回值,新创建的对象(实例);
     当手动添加返回值后(return语句):

          1. 返回值是基本数据类型-->真正的返回值还是那个新创建的对象(实例)
          2. 返回值是复杂数据类型(对象)-->真正的返回值是这个对象 

看一个常见的面试题

<script>  function foo() {    var f2 = new foo2();    console.log(f2);  //{a: 3}    console.log(this); //window    return true;  }  function foo2() {    console.log(this); //foo2类型的对象 不是foo2函数//    this.age = 30;    return {a: 3};  }  var f1 = foo();  console.log(f1); // true</script>


函数重载  出处:http://www.cnblogs.com/mrweb/archive/2013/02/01/2888366.html

重载overload:通过重载这个构造函数方法让它根据传入参数的不同,来执行不同的初始化方法。

其它面向对象语言如Java的一个常见特性是:能够根据传入的不同数量量或类型的参数,通过“重载”函数来发挥不同的功用。但是这个特性在Javascript中并没有被直接支持,可是有很多办法实现这一功能。

不管何种面向对象语,函数重载必须依赖两件事情,分别是:
1)判断传入参数数量的能力
2)判断传入参数类型的能力

第1件事情:Javascript判断传入参数数量

Javascript的每个函数都带有一个仅在这个函数范围内作用的变量——arguments,它是一个包含所有传给函数的参数的伪数组。为什么是伪数组?—— 你不能修改它,也不能用push来添加新元素等。但是你可以访问其中的元素,并且同时具有.length属性。有了length属性,我们就可以很方便的知道函数传入了几个参数。

function send( message, who ) {if( arguments.length >= 2 ) {console.log("你对" + who + "说:" + message);}else {console.log("你对大家说:" + message);}}

第2件事情:Javascript判断传入的参数类型

如果我们在函数中并没有提供参数,那么message和who的值一定为'undefined'。我们可以使用typeof message = 'undefined'来判断是否传入了参数。

function send( message ) {if( typeof message === 'undefined' ) {console.log("ERROR:错误的信息内容");}else {console.log("你说:" + message);}}

javascript中的类型检查我常常用两种方法来判断:

方法1:typeof 变量 == '类型名'。如下:

var x = 123;typeof x == 'number' //truex = '123';typeof x == 'string' //true

但是,对于Array和Object对象,typeof之后的值是一样的,都为Object。即 typeof [] == type new Object(),如此当我们想要判断一个对象是否为数组或我们自定义的对象时,这种方法就显得有点不够好了。

方法2:利有构造函数来判断变量类型( 变量.constructor == 构造函数)

var num = 1, str = 'abcd', arr = [], obj = {}, tf = true, f = function(){};

用typeof对它们分别进行求值后,得到的结果分别是:number、string、 object、 object、 boolean、 function

如果分别调用它们的构造函 数,得到的结构分别是:Number、String、Array、Object、Boolean、Function

 

了解了上面两件事情(变量个数、变量类型)之后,我们就可以创造出属于自己的Javascript重载函数了。


举个栗子   出处:http://niutuku.com/tech/javaScript/273658.shtml

function Set() {    this.values = {};            // 用这个对象的属性保存这个集合    this.n = 0;                    // 集合中值的个数        // 如果传入一个类数组的对象,将这个元素添加到集合中    // 否则,将所有的参数都添加到集合中    if(arguments.length === 1 && isArrayLike(arguments[0])) {        this.add.apply(this, arguments[0]);        //把对象利用apply()添加到集合中    }else if(arguments.length > 0) {        this.add.apply(this, arguments);        // 利用add()方法添加所有参数到集合中    }}
这段代码所定义的Set()构造函数可以显式将一组元素作为参数列表传入,也可以传入元素组成的数组。但这个构造函数有多义性,如果集合的某个参数是一个数组就将无法通过这个构造函数来创建这个集合了(为了做到这一点,需要首先创建一个空集合,然后显示调用add()方法)。

工厂方法

一个类的方法用于返回类的一个实例。

// 工厂方法通过数组初始化Set对象
Set.fromArray = function(arr) {
    var s = new Set();
    s.add.apply(s, arr);
    return s;
};
不同名字的工厂方法用以执行不同的初始化。但由于构造函数是类的公有标识,因此每个类只能有一个构造函数。但这并不是一个必须遵守的规则。

辅助构造函数

通过以函数的形式调用Set()来初始化这个新对象

// 定义Set类型的一个辅助构造函数function SetFromArray(arr) {    // 通过以函数的形式调用Set()来初始化这个新对象    // 将arr的元素作为参数传入    Set.apply(this, arr);}// 设置原型, 以便SetFromArray能创建Set实例SetFromArray.prototype = Set.prototype;
引用大神的一句话:JavaScript 没有做不到,只有想不到

0 0