2014-01-23 3 views
2

В настоящее время я делаю чат AI, который использует цепочки марков. Один из объектов серверных является объектом, который отображает строку в любую цепи, что она является частью, так что:Есть ли способ сделать «конструктор» действительным ключом в объекте JS?

var words = {} 

words['test'] = [ ['this','is','a','test'], ['this','too','tests','things'] ] 

Теперь у меня есть проблема. «конструктор» - вполне допустимое слово, но кажется, что вы не можете сопоставить его, как я описал выше, поскольку «конструктор» является свойством каждого объекта в JS (как и другие вещи, конечно). Итак, на мой вопрос: есть ли способ построить эту карту?

+0

Вы не можете использовать функцию-конструктор? – elclanrs

+0

@elclanrs Я думаю, вы пропустили точку вопроса: мне просто нужна карта; функциональность объекта не требовалась. – Seiyria

ответ

7

constructor не является собственностью каждого объекта. Хотя по умолчанию каждый объект, созданный из буквенного синтаксиса, будет иметь constructor в своей цепочке прототипов. Это происходит потому, что эти объекты наследуются от Object.prototype, у которых есть это свойство.

Одним из решений является использование объектов, не имеющих цепи прототипов.

var words = Object.create(null); 

words['test'] = [ ['this','is','a','test'], ['this','too','tests','things'] ]; 

Теперь не будет унаследованных свойств, чтобы запутать вещи. Однако это не будет работать в IE8 и ниже.


Другим решением является использование .hasOwnProperty(), чтобы увидеть, если constructor имущества находится на самом или унаследованный объекте. Если унаследовано, то это не тот, который вы хотите.

if (words.hasOwnProperty("constructor")) 
    console.log(words.constructor); 

Если условие проходит, то мы знаем, что мы не используем наследственное имущество, а собственность объекта.

+2

'.hasOwnProperty' будет иметь проблемы, если ключ' hasOwnProperty' был перезаписан. Рекомендуемым решением для использования объекта в качестве хэш-карты является использование функции 'has', например' function has (obj, key) {return Object.prototype.hasOwnProperty.call (obj, key)} '. – zzzzBov

+0

@zzzzBov: Если 'hasOwnProperty' может быть собственным свойством в словах, затеняя прототипированный, то это поможет. Но если '.hasOwnProperty()' на самом деле * перезаписан *, использование 'Object.prototype.hasOwnProperty' на самом деле не поможет. Возможно, вы имели в виду затенение. –

+0

Эй, спасибо! Я никогда не знал о 'Object.create (null)', и это сделало трюк. – Seiyria

Смежные вопросы