如何将自定义属性添加到 HTML 环境,该属性将默认为元素的每个新实例上的空对象
How can I add a custom attribute to an HTMLElement, that will default to an empty object on each new instance of the element?
如果我在HTMLElement
的原型中添加一个新属性,并将其默认值设置为' {}
'(一个空对象(:
Object.defineProperty(HTMLElement.prototype, 'customObject',
{ configurable: true, enumerable: true, writeable: true, value: {} });
现在我创建一个新div
(这也是一个HTMLElement
(:
var e = document.createElement('div');
我将一个属性分配给e
的customObject
:
e.customObject.prop = "bla";
如果我提醒它,我会看到所需的值:
alert(e.customObject.prop); // Displays 'bla'.
现在我创建一个新的、不同的div
元素:
var d = document.createElement('div');
这个d
现在应该有一个空的customObject
属性,对吧?
但是,如果我提醒它:
alert (d.customObject.prop);
我得到这个意想不到的结果:
bla
怎么来了?当我创建一个新元素时,它不应该有一个HTMLElement.prototype的"空白"实例吗?
( JSFIDDLE: http://jsfiddle.net/5pgr38mb/(
编辑:我正在寻找一种适用于深度克隆的解决方案(克隆节点(true((。含义 - 如果自定义对象在元素或其任何子元素上具有属性,则该元素或子元素将在克隆实例中保留其值(这是"本机"HTMLElement 属性的正常行为(。
我可能会使用原型 getter,它在调用时在实例上创建新的对象属性:
Object.defineProperty(HTMLElement.prototype, 'customObject', {
enumerable: true,
get: function() {
if(this.__thisCustomObject === undefined) {
this.__thisCustomObject = {};
// or non-enumerable with:
// Object.defineProperty(this, '__thisCustomObject', {
// enumerable: false,
// value: {}
// };
}
return this.__thisCustomObject;
},
set: function(val) {
this.__thisCustomObject = val;
}
});
这样,每次您第一次请求对对象进行customObject
时,它都会创建一个新对象并将其存储在该对象的 __thisCustomObject
属性中。然后,所有将来的customObject
请求都使用该元素的__thisCustomObject
属性。
请注意,这是 getter-setter 模式,非常接近 Web IDL 规范中实际每个元素 DOM 属性的实现方式。这里唯一的区别是每个元素的值存储在属性中,而不是隐藏映射中。
您可以覆盖document.createElement
函数。只需打开控制台(大多数浏览器中为 F12(,然后单击"运行"即可查看此代码的结果。
document.createElement = (function () {
var reference = document.createElement;
return function (name) {
var e = reference.call(document, name);
e.customObject = {
configurable: true,
enumerable: true,
writeable: true,
value: {}
};
return e;
};
}());
var e = document.createElement('div');
e.customObject.prop = "bla";
console.log(e.customObject.prop);
var d = document.createElement('div');
console.log(d.customObject.prop);
- 显示模块模式在Knockout中设置模型的新实例
- 如何基于数组值创建新实例
- VS2010 javascript调试器希望在VS2010的新实例中启动
- 将新类实例中的数据存储在数组中
- Web服务器意外退出,正在重新启动新实例
- JavaScript - 有没有办法动态创建对象的新实例
- Jquery类选择器无法选择用.append()添加的新类实例
- 创建新日期实例时的奇怪行为
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- CKEditor新实例始终处于卸载状态
- Javascript - 如何创建新的函数实例
- JavaScript中Var类型的新实例
- jQueryFileTree如何清除实例、重新实例化新实例或刷新
- angular.injector在每次调用时返回新的服务实例
- 每次使用角度控制器都会创建一个新的if实例
- 使用模块模式时,如何创建对象的新实例
- 使用动态函数名编写Javascript新对象实例
- Reset All按钮从JS literal添加一个新的实例jQuery
- 当一次将事件绑定到多个元素时,每个元素都有新的实例
- Angular 2 RC5的组件级提供商每次都会获得新的实例