头部背景图片
senrenbankaの部落格 |
senrenbankaの部落格 |

javascript函数化构造器

javascript是基于原型继承而不是基于类继承的(至少在ES6之前是这样的。。。),javascript对于继承这方面很模糊,它提供了原型的继承方式,却又提供了”伪类”的写法,比如下面这样:

var Father = function() {
    this.nickname = '粑粑';
    this.say = function() {
        return '我是老爸';
    };
    this.statu = function() {
        return '我的地位是第一层';
    }
}
//声明一个伪类,通过prototype继承父类
var Children = function() {
}
Children.prototype = new Father();
Children.prototype.nickname = '儿子';
Children.prototype.say = function() {
    return '我是儿子';
}
Children.prototype.statu = function() {
    return '我的地位是第三层';
}

var child = new Children();
child.nickname                //儿子
child.say()                    //我是儿子
child.statu()                //我的地位是第三层

尽管我们用’伪类’的方式完成了继承,但是我们并不是用抽象的方式描述这个继承关系的,而是用了具体的,公开的方式去写继承,这种方式对于代码的安全性来说是不友好的,容易被攻击者篡改,代码维护方面也有问题,而且,使用实例必须要通过new去执行,如果没有new,结果会完全不同,变成了调用一个函数,意思就完全不同了。

所以,根据以上的情况,一个解决方案是我们不要用new这种模棱两可的方式,而是用函数化构造器,那函数化构造器又是怎么写的?这里给出一个通用的代码格式:

var constructor = function(spec,my) {
    var that = {};   //这里可用任何能产生对象的方法,包括Ojbect.create(),new Object()之类的方法
    //my作为一个共享的容器,自上而下传入,自下而上构造
    my =  my || {};
    my.public  = value;
    //spec作为一些配置的信息,里面包含了构造的对象需要的属性或者方法
    that.example = spec.example;
    //然后就是对象自己构造属性或方法了
    that.someProperty = function() {
        ....
    }
    //或者,为了更安全的着想,我们分两步构造
    //这样是为了不破坏我们原来构造的方法或者属性
    var someProperty = function() {
        ....
    }
    this.someProperty = someProperty;
    return that;
}

这种方式关键有利于属性方法的隐藏,有利于安全,并且可以用函数式的方法去写。

avatar AONOSORA 今生今世轮回尽, 来世愿为幻想乡