Я пишу JavaScript-библиотеку, которая предлагает функцию tablify(anything);
, которая может представлять любой массив или объект в виде таблицы HTML.Как правильно расширить Obect.prototype?
Сейчас я пытаюсь расширить массив и объектов прототипов для того, чтобы использовать его как это:
var arr = ["a", "b", "c"];
var obj = {"A": "a", "B": "b", "C": "c"};
arr.tablify();
obj.tablify();
Это мой подход:
Array.prototype.tablify = function() {
return tablify(this);
}
Object.defineProperty(Object.prototype, 'tablify', {
value: function() {
return tablify(this);
},
writable: true,
configurable: true,
enumerable: false
});
Проблема в том, что все в JavaScript - это объект, и поэтому не только литералы, как {a: 1, b: 2}
, могут быть преобразованы, но и все остальное.
Это будет не такое большое дело, так как мой tablify()
может также иметь дело с примитивными типами, но когда я расширяю Object.prototype, typeof anything
всегда возвращает "object"
и я не могу различать типы больше:
function tablify(object) {
if (object instanceof Array) {
return ArrayToTable(object);
}
//This is always true if I extend Object.prototype:
if (typeof object === "object") { //only for "normal" objects like "{a: 1, b: 2, c: [],...}"
return ObjectToTable(object);
}
return PrimitiveToTable(object); //strings, numbers, functions, ...
}
- Почему
typeof
всегда возвращается"object"
? - Хорошо ли JS-API обеспечить такую функциональность (расширение массивов/объектов с помощью .tablify(); ")?
- Как можно различать «нормальные» объекты, числа, функции, ...?
- Возможно ли продлить только «обычные» объекты? (forbid
(42).tablify();
,"string".tablify();
...) - Какое название для этих «нормальных» объектов? Как мне их называть?
Функция, которая создает HTML из объекта, не похожа на то, что вы обычно хотели бы добавить в прототип собственных объектов? – adeneo
Неверно, что «все в JavaScript - это объект». Строки, числа и булевы не являются объектами. Они * действуют как * объекты в ситуациях, когда они призваны сделать это, потому что язык неявно преобразует их в соответствующий тип объекта. – Pointy
@Pointy Когда я использую свой код, '42.tablify();', '" string ".tablify();', 'func.tablify();' тоже работают, хотя я только расширяю Object.prototype. И 'typeof' возвращает' 'object" 'также ... – maja