是否可以在jQuery/Javascript中存储非实例化对象的信息?

Is it possible to store information on non-instantiated objects in jQuery/Javascript?

本文关键字:实例化 对象 信息 存储 jQuery Javascript 是否      更新时间:2023-09-26

我通过连接字符串元素在Javascript中创建HTML标记。像这样:

var makeButton = function (el) {
    'use strict';
    var config = el.attr("data-config"),
        dyn = $.parseJSON(config),
        hover = false,
        state = 'up',
        hrf = '',
        ...
  if (dyn.href) {
      hrf = 'href="' + dyn.href + '" ';
  }
  ...
  // when all variables have been set, concat  
  iconspan = dyn.icon ? '<span class="ui-icon ' + icn + icp + ics + '">&nbsp;</span>' : '';
  textspan = '<span class="ui-btn-text">' + txt + '</span>';
  innerspan = '<span class="ui-btn-inner">' + textspan + iconspan + '</span>';
  btn = '<a data-role="button" data-wrapperels="span" class="ui-btn ' + hvr + cls + '" ' + data_icp + data_thm + data_min + data_inl + '>' + innerspan + '</a>';
  return btn;
};

当所有设置完成后,我将字符串返回给调用函数,在那里它被插入到正在创建的其他字符串中。我想知道是否有可能存储我正在创建的任何信息。因为我没有实例化到jQuery (= $( btn )),我不能使用data()之类的东西添加任何信息。

问题:
因此,如果我有一个普通的"字符串",我有什么替代方案(如果有的话)来存储该字符串上的信息?

那么如果我有一个普通的"字符串",我有什么替代方法(如果有的话)来存储该字符串上的信息?

基本值可以没有属性,所以你不能在上存储任何内容。要么切换到对象,要么将信息存储在由字符串值标识的其他静态结构中(当然,这时函数需要返回不同的字符串,并且垃圾收集有些复杂)。

所以你可以只使用String对象包装你想返回的字符串。它们在基本操作(例如串联)中具有相同的行为,但您可以在它们上存储额外的信息:

btn = new String(btn);
btn.data = …;
return btn;

我不完全确定您想要实现什么(可能值得考虑使用像mustash .js这样的模板语言或下划线模板,而不是连接字符串),但是如果您想在两个分散的数据位之间创建关系,那么关联数组应该完成这项工作。

// Use a JavaScript object as an Associative Array.
dataByButtonMarkupMap = {};
// Build your button markup as before.
btnMarkup = "..."
// Use the markup as a Key in the associative array, don't worry that it's massive, as long
// as it's a string (or can be coerced to one), it can be used as a key.
dataByButtonMarkupMap[btnMarkup] = "some data";
// You can now retrieve that data via the button markup
var myData = dataByButtonMarkupMap[btnMarkup];

可能值得考虑重构你的设计,这样你就可以返回一个同时封装了模板字符串和数据的对象,而不是传递字符串,例如:

function makeButton() { 
    // ...
    // Return an object instead of a string so you can encapsualte
    // additional data alongside the template string.
    return {
        template: btn,
        data: "some data"
    }
}

希望对你有帮助。