描述:
我试图动态地获取HTML对象的值。所以我在Object上写了一个原型函数select。它可以在控制台上工作,但不能在脚本中工作。jquery属性对它不利。
错误:
Uncaught TypeError: can't assign to property "guid" on "innerText": not an object
相关对象的输出:
Object { 0: th, 1: th, 2: th, 3: th, 4: th, 5: th, length: 6, prevObject: {…} }
在对象上选择功能:
Object.prototype.select = function(what)
{
return this.map(function() {
return this[what];
}).get();
}
呼叫:
label.select('innerText')
这是一个已知的错误吗?有变通办法吗?调试器只是与jquery中的一点有关:
S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++)
已经做了一个变通方法:
function getData(data)
{
return $(data).map(function() {
return this.value;
}).get();
}
向Object.prototype
对象添加属性是个好主意。用这样的简单赋值来添加它们,这样它们就可以枚举,这是一个特别是的坏主意。此外,在查看select
函数的内容时,请注意,实际上没有对象上有map
方法。(数组是唯一具有map
的内置对象。jQuery对象也具有它。(
我强烈建议不要在Object.prototype
中添加任何内容。
但是,如果你无论如何都这样做,请使你添加的内容"不可枚举":
Object.defineProperty(Object.prototype, "select", {
value() {
// ...your code here
},
writable: true,
configurable: true,
});
这仍然不是一个好主意,因为库拥有自己的专用对象并不罕见,这些对象很可能有select
方法(例如,jQuery对象(,会设置冲突。但至少如果使其不可枚举,则该属性不会显示在for-in
循环和类似循环中。
如果这是一个特定于jQuery的用例,您可以创建一个jQuery插件函数。
类似于:
(($) => {
// $.fn is alias for $.prototype
$.fn.getArr = function(what) {
return this.map((i,el) => $(el)[what]()).get();
}
})(jQuery)
console.log($('p').getArr('text'))
console.log($('input').getArr('val'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Para 1</p>
<p>Para 2</p>
<input value="one" />
<input value="two" />