jQuery插件选项:必需,可选,不可访问

dev*_*vth 5 javascript jquery jquery-plugins data-structures

我很好奇如何以某些需要的方式为jQuery插件指定选项,有些是可选的重写,有些是无法触及的.

我开始平常:

jQuery.fn.plugin = function (options){
  var defaults = { username: "", posts:10, api: "http://myapi.com" }
  var settings = jQuery.extend({}, defaults, options);
}
Run Code Online (Sandbox Code Playgroud)

假设我想要username是必需的,posts是可选的(默认为10),你(你是插件的用户)不能改变api,即使他们尝试.理想情况下,它们仍然处于相同的数据结构中,而不是分成单独的对象.想法?

ndp*_*ndp 5

$.fn.plugin = function(username, options) {
  if (!username) throw "Must provide a username.";

  var config = $.extend({}, $.fn.plugin.defaults, options);

  var privateVal = 4;
  ...
}

$.fn.plugin.defaults = {
  posts: 10
}
Run Code Online (Sandbox Code Playgroud)

这是一个总结:

  • 所需参数通常最清楚地作为正常有序参数传递.如果有太多这些考虑某种结构 - 或更好 - 一个不同的API.
  • 通过选项哈希最容易指定选项作为最后一个参数.一般来说,这些应该是可选的,但如果丢失则肯定会抛出错误.
  • 使用jQuery的extend函数填写默认值.你通常会有一些"默认值"来收集它们.我喜欢将这些内容作为名称间距的插件名称本身 - 并作为有用选项的有用文档.
  • 通常,throw如果缺少必需参数.
  • 如果你有值,你不希望调用者搞乱,在你的插件中定义它们,Javascript的范围将阻止调用者搞乱它们.


Nic*_*ver 1

如果您希望用户名是必需的,我会将其设置为一个参数,因为它是唯一必需的内容,并且您想要这样做的参数没有 20 个。像这样的东西:

jQuery.fn.plugin = function (username, options){
  var defaults = { posts:10, api: "http://myapi.com" }
  var settings = jQuery.extend({}, defaults, options);
}
Run Code Online (Sandbox Code Playgroud)

没有一种干净的必需方法可以在单个传递的对象中完全完成此操作,至少不是简单的方法,而这正是您想要的 API。另一种选择是不指定默认值和警报或其他内容(如果我认为不存在的话):

jQuery.fn.plugin = function (options){
  var defaults = { posts:10, api: "http://myapi.com" }
  var settings = jQuery.extend({}, defaults, options);
  if(typeof options.username == 'undefined') { 
    alert("You must specify a username");
    return this;
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑- 错过了问题的一部分,对于无法访问的问题,要么对值进行硬编码,因为这是相同的结果,要么更干净一点是插件内的内部对象,该对象超出了其他地方的范围。同样,对同一个对象执行的操作并不是微不足道的,除非您一直说一个intenalDefaults对象,并在扩展设置jQuery.extend()调用它,这样它就会覆盖消费者传入的任何内容。