2015-10-28 5 views
1

У меня мало переменных, которые имеют тип number (или, что то же самое, строки). Я хочу добавить некоторые метаданные к этим переменным.JS: как определить свойства на числовые переменные

Когда я пытаюсь использовать Object.defineProperty(myvar, "prop", {/*getter & setter*/}), он дает сообщение об ошибке, что myvar не является объектом.

Как определить свойство на не-объектах с методами getter и setter?

Я не хочу что-то добавлять к Number.prototype, потому что я хочу, чтобы эти свойства были доступны только для нескольких переменных.

+0

Не будет помещать объекты в массив и используя числовой индекс быть обычным способом справиться с этим? – Filburt

+0

Используйте объекты 'Number' и' String' вместо примитивов, если вы действительно настаиваете на свойствах. Нет, вы не можете поместить свойства по не-объектам * по определению *. – Bergi

ответ

0

Вы можете сделать это по прототипному наследованию. Использование Number.prototype так:

var proto = Object.create(Number.prototype); 
function MyNumber() { 
} 
MyNumber.prototype = proto; 
MyNumber.prototype.constructor = MyNumber; 
MyNumber.prototype.someOwnMethod = function() { 
} 
// and so on 
var myVar = new MyNumber(); 
Object.defineProperty(myvar, "prop", {/*getter & setter*/}); 

Вы получите объект в прототипах вместе с методами Number.

Или, если вам не нужны какие-либо собственные методы, просто используйте конструктор Number вместо литерального числа.

var myVar = new Number(); 
Object.defineProperty(myvar, "prop", {/*getter & setter*/}); 

То же для строк:

var myVar = new String(); 
+0

Функция, которую я пишу, принимает объект JSON как параметр, и этот JSON имеет разные свойства, которые имеют примитивный тип. Я хотел добавить метаданные к этим свойствам без изменения типов данных этих свойств или добавления чего-либо к прототипу. Поскольку нет способа добавить метаданные к примитивным типам, теперь я создаю новый объект JSON в моем методе с одинаковой структурой входного параметра, но для значений я использую эквивалентные объекты примитивных типов и возвращая этот новый объект JSON из моего метода. Чтобы исходный объект оставался неповрежденным. –