所以我使用这个非常标准的jquery插件模式,你可以在将jquery函数应用到特定实例后获取api。
这个API本质上是一个包含大量方法和数据的javascript对象。
所以我想基本上为对象创建一些私有内部方法来操作数据等,这些方法不需要作为API的一部分提供。
所以我尝试了这个:
// API returned with new $.TranslationUI(options, container)
$.TranslationUI = function (options, container) {
// private function?
function monkey(){
console.log("blah blah blah");
}
// extend the default settings with the options object passed
this.settings = $.extend({},$.TranslationUI.defaultSettings,options);
// set a reference for the container dom element
this.container = container;
// call the init function
this.init();
};
我遇到的问题是init无法调用该函数“monkey”。我不理解为什么它不能解释。是因为init是原型方法吗?($。TranslationUI的原型扩展了一堆方法,包括代码中的其他地方的init)
$.extend($.TranslationUI, {
prototype: {
init : function(){
// doesn't work
monkey();
// editing flag
this.editing = false;
// init event delegates here for
// languagepicker
$(this.settings.languageSelector, this.container).bind("click", {self: this}, this.selectLanguage);
}
}
});
任何解释都会有所帮助。我也喜欢用这个模型创建私有方法的其他想法。
这些特定的功能不一定是原型,我不需要保护私有方法不被外部使用,但我想知道将来我应该如何满足这一要求。
//根据马修的评论编辑 所以我尝试根据Matthew的评论移动原型定义。这似乎现在有效,但仍不确定这是否是正确的方法。思考?显然,如果我将原型对象移动到一个单独的区域中会更干净
$.TranslationUI = function (options, container) {
function monkey(){
console.log("blah blah blah");
}
// extend the default settings with the options object passed
this.settings = $.extend({},$.TranslationUI.defaultSettings,options);
// set a reference for the container dom element
this.container = container;
$.extend($.TranslationUI.prototype,
{
init : function(){
monkey();
// editing flag
this.editing = false;
// init event delegates here for
// languagepicker
$(this.settings.languageSelector, this.container).bind("click", {self: this}, this.selectLanguage);
}
}
);
// call the init function
this.init();
};
因此,虽然这很有效,但每次构造函数运行时,我都会重新启动原型。我敢肯定这不高效。但不确定如何让原型方法可以访问某个实例的私有函数/变量。
答案 0 :(得分:1)
错误是因为在你从$ .extend调用的范围内没有定义monkey。
答案 1 :(得分:1)
好的。因此,在Crockford网站上确认了stackoverflow的答案。
javascript - accessing private member variables from prototype-defined functions
基本上,您无法真正从原型方法访问私有函数。你可以通过'特权'函数来反过来调用私有变量和函数,但是你基本上创建了一堆getter和setter,它们可能只是在原型“public”方法中加倍。
所以它有很多工作,特别是如果你的东西不是真的需要私密。
答案 2 :(得分:0)
看看我的回答和其他一些人: