JavaScript极简入门教程(二):对象和函数(4)

上面的代码很简单,但是没法保护私有成员。我们可以使用模块模式。在模块模式中,某类对象由一个函数产生,并利用函数作用域保护私有成员不被外部访问:

复制代码 代码如下:


// mammal 函数,用于构造 mammal 对象
var mammal = function(spec) {
    // that 为构造的对象
    var that = {};
 
    // 公有方法 get_name 可被外部访问
    that.get_name = function() {
        // spec.name 外部无法直接访问
        return spec.name;
    };
 
    // 公有方法 says 可被外部访问
    that.says = function() {
        // spec.saying 外部无法直接访问
        return spec.saying || '';
    };
 
    return that;
};
 
// 创建 mammal 对象
var myMammal = mammal({name: 'Herb'});
 
// cat 函数,用于构造 cat 对象
var cat = function(spec) {
    spec.saying = spec.saying || 'meow';
 
    // cat 继承自 mammal,因此先构造出 mammal 对象
    var that = mammal(spec);
 
    // 添加公有方法 purr
    that.purr = function(n) {
        var i, s = '';
        for (i = 0; i < n; i += 1) {
            if (s) {
                s += '-';
            }
            s += 'r';
        }
        return s;
    };
 
    // 修改公有方法 get_name
    that.get_name = function() {
        return that.says() + ' ' + spec.name +
            ' ' + that.says();
        return that;
    };
};
 
// 创建 cat 对象
var myCat = cat({name: 'Henrietta'});

在模块模式中,继承是通过调用构造函数来实现的。另外,我们还可以在子类中访问父类的方法:

复制代码 代码如下:


Object.prototype.superior = function(name) {
    var that = this, method = that[name];
    return function() {
        return method.apply(that, arguments);
    };
};
 
var coolcat = function (spec) {
    // 获取子类的 get_name 方法
    var that = cat(spec), super_get_name = that.superior('get_name');
    that.get_name = function(n) {
        return 'like ' + super_get_name() + ' baby';
    };
    return that;
};


您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgsgfj.html