在显示模块化模式对象上创建继承

2024-02-02

我正在尝试在对象之间创建某种继承:

var foo = (function(){

    function doFooStuff(){
        console.log(arguments.callee.name);
    }

    return {
        doFooStuff: doFooStuff
    }

})();

var bar = (function(){

    $.extend(this, foo);

    function doBarStuff(){
        console.log(arguments.callee.name);
        doFooStuff();
    }

    return {
        doBarStuff: doBarStuff,
    }

})();

bar.doBarStuff();
bar.doFooStuff(); //<-- Uncaught TypeError: 
                  //Object #<Object> has no method 'doFooStuff' 

http://jsfiddle.net/wRXTv/ http://jsfiddle.net/wRXTv/

为什么不是doFooStuff这里可以访问吗?您会推荐另一种方法而不是使用$.extend?


$.extend(this, foo);

this不是从下面的函数返回的对象(事实上它不能是,因为它是在此调用之后创建的),而是全局对象 - 检查MDN 的介绍this keyword https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this.

对于你想做的事情,有两种方法:

  • 复制所有属性 http://api.jquery.com/jQuery.extend/ from foo到你的bar对象创建后:

    var bar = (function() {
        …
        return {…};
    })();
    $.extend(bar, foo);
    

    您也可以直接在返回的对象上执行此操作:

        return $.extend({…}, foo);
    

    此模式的一个变体允许您覆盖foo特性。复制foo到一个空对象中,然后写下你的bar它的属性:

        return $.extend({}, foo, {…});
    
  • 使用原型继承。Create https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create一个继承其属性的对象foo,然后写下你的bar它的属性:

        return $.extend(Object.create(foo), {…});
    

    现在,当foo之后发生更改,您仍然可以访问这些新属性bar(除非它们被自己的属性所掩盖)。请注意Object.create旧环境中可能不支持,但您可以轻松地填充它。


正如@raina77ow 所指出的,您的doBarStuff功能也有缺陷。这doFooStuff函数不在您的函数范围内,您无法更改它。您永远无法从以下位置访问私有声明的函数和变量:foo模块,仅那些公开的 - 如果您确实需要它们,请考虑不同的模式或应用程序设计。然而,doFooStuff是导出(公共)的属性foo对象,bar 继承自该对象(无论以上述哪种方式演示)。因此,您可以将其作为以下方法访问:bar同样,通常通过使用this.doFooStuff().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在显示模块化模式对象上创建继承 的相关文章

随机推荐