Я играл с этим, так как мне нравятся мои перечисления. =)
Используя Object.defineProperty
Я думаю, что я придумал несколько жизнеспособное решение.
Вот jsfiddle: http://jsfiddle.net/ZV4A6/
Используя этот метод, вы должны (теоретически) иметь возможность вызывать и определять значения перечисления для любого объекта, не затрагивая другие атрибуты этого объекта.
Object.defineProperty(Object.prototype,'Enum', {
value: function() {
for(i in arguments) {
Object.defineProperty(this,arguments[i], {
value:parseInt(i),
writable:false,
enumerable:true,
configurable:true
});
}
return this;
},
writable:false,
enumerable:false,
configurable:false
});
Из-за атрибута writable:false
это должно сделать его безопасным.
Итак, вы должны иметь возможность создать пользовательский объект, а затем называть его Enum()
. Значения, назначенные значения, начинаются с 0 и приращения для каждого элемента.
var EnumColors={};
EnumColors.Enum('RED','BLUE','GREEN','YELLOW');
EnumColors.RED; // == 0
EnumColors.BLUE; // == 1
EnumColors.GREEN; // == 2
EnumColors.YELLOW; // == 3
Как сказал Бо в своем комментарии, раздел .text
доступен только для чтения по текущим системам. Чтобы этот код работал, вы должны сделать его доступным для записи. Например, вы можете использовать директиву в исходном файле:
.section wtext, "awx", @progbits
Эквивалентная nasm
директива:
section wtext exec write
В качестве альтернативы, также можно передать -N
переключиться на компоновщик.
Обратите внимание, что такой код оболочки обычно предназначен для выполнения стека, что является еще одной вещью, которая обычно отключается в текущих операционных системах. Если вы когда-нибудь захотите попробовать это в стеке, вам может понадобиться опция -z execstack
компоновщика.