频道栏目
首页 > 资讯 > JavaScript > 正文

js构造函数

17-09-05        来源:[db:作者]  
收藏   我要投稿

在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式。

对象字面量是一种灵活的创建方式,如下:

var obj = {
    name:"I'm tom",
    getName:function(){
        return this.name;
    }
}
这样就创建了一个obj对象,它具有一个成员变量name以及一个成员方法getName,这种写法不需要定义构造函数。这种写法的缺点是,每创建一个新的对象都需要写出完整的定义语句,如果要创建大量的相同对象则需要写很多遍代码,使得代码冗余,同时也不利于使用js对象的继承等高级特性。

JS中没有类的概念,那么我们不妨就使用一种函数将以上对象创建过程封装起来以便于重复调用,同时可以给出特定接口来初始化对象,如下:

function createObj(name) {
    var obj = new Object();
    obj.name = name;
    return obj;
}

var obj1 = createObj("easy1");
var obj2 = createObj("easy2");
...
var objn = createObj("easyn");
这样一来我们就可以通过createObj函数源源不断地”生产”对象了。

在上面创建Object这样的原生对象的时候,我们就使用过其构造函数:

var obj1 = createObj("easy1");
那么构造函数和普通函数有什么区别呢?

(1),实际上并不存在创建构造函数的特殊语法,其与普通函数唯一的区别在于调用方法。对于任意函数,使用new操作符调用,那么它就是构造函数;不使用new操作符调用,那么它就是普通函数。
(2),按照惯例,我们约定构造函数名以大写字母开头,普通函数以小写字母开头,这样有利于显性区分二者。例如上面的new Array(),new Object()。
(3),使用new操作符调用构造函数时,会经历:

(1)创建一个新对象;

(2)将构造函数作用域赋给新对象(使this指向该新对象);

(3)执行构造函数代码;

(4)返回新对象;

注意:

因为构造函数也是函数,所以可以直接被调用,但是它的返回值为undefined,此时构造函数里面的this对象等于全局this对象。this.name其实就是创建一个全局的变量name。

如果有多个构造函数,而且这些构造函数都有同样的内置函数如getName时,会重复写多次该函数,此时我们通过将getName()函数定义为全局函数,这样对象中的getName属性则被设置为指向该全局函数的指针。由此obj1和obj22共享了该全局函数,解决了内存浪费的问题。

function createObj1(name) {
    var obj = new Object();
    obj.name = name;
    obj.getName=function(){
        return this.name;
    }
    return obj;
}
function createObj2(name) {
    var obj = new Object();
    obj.name = name;
    obj.getName=function(){
        return this.name;
    }
    return obj;
}
可将如上代码简化至如下代码:
function createObj1(name) {
    var obj = new Object();
    obj.name = name;
    obj.getName=getName();
    return obj;
}
function createObj2(name) {
    var obj = new Object();
    obj.name = name;
    obj.getName=getName();
    return obj;
}
function getName(){
    return this.name;
}

不同于其它的主流编程语言,JavaScript的构造函数并不是作为类的一个特定方法存在的;当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器。一个函数要作为一个真正意义上的构造函数,需要满足下列条件:
1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。
2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。

关于js构造函数还有许多要深入理解的知识,我会继续补充完善。

相关TAG标签
上一篇:Linux驱动的等待队列、轮询及内核线程
下一篇:python把一个随机长度整数组分成两组的差值最小
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站