我正在尝试在对象之间创建某种继承:
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(使用前将#替换为@)