2013-06-10 3 views
0

При использованииПравильный способ обнаружения абстрактных объектов/ссылочных типов?

$P.isObjectAbstract = function (obj) { 
    return obj === Object(obj); 
}; 

я получаю ошибку JSLint:

line 77 character 31 Use the object literal notation {} or Object.create(null).

Однако эта форма (ниже) производит различные результаты.

$P.isObjectAbstractZ = function (obj) { 
    return obj === Object.create(obj); 
}; 

Я использую термин objectAbstract дифференцировать от objectLiteral, который был бы из нравов простой формы var object_literal = {}.

ObjectAbstract - это что-то с ключами, к которым можно получить доступ как таковой localStorage.some_key (точнее, это магический объект-хост).

Есть ли подходящий способ jslint для тестирования абстрактных объектов?

+1

Не хотите ли вы возвращать obj === Object.create (obj); '? JSLint говорит 'Object.create (null)', потому что он ссылается на создание пустого объекта. – Ian

+0

О, ха-ха, я думал, что поймал проблему :) – Ian

+0

... но лучший вопрос мог быть, есть ли разница между «Object (obj)» и «Object.create (obj)» –

ответ

2

JSLint показывает плохое знание Javascript здесь и думает, что вы делаете new Object(), что не является рекомендуемым способом создания нового объекта. Рекомендуемым способом является объектный литерал или Object.create.

Вызов Object с аргументом совершенно другой. Он часто используется для определения того, является ли что-то примитивным типом или ссылочным типом.

Вы можете работать вокруг JSLint с помощью:

$P.isObjectAbstract = function(obj) { 
    return obj === {}.constructor(obj); 
}; 

Обратите внимание, что как я уже сказал выше, это не делает ничего подобного «обнаруживает абстрактные объекты», как вы описываете. Правильное имя будет isReference или isReferenceType или что угодно.

+0

Это работает. Могу ли я заменить '{} .' на' Object.'? –

+0

@ pure_code.mom нет, '.constructor'' Object' является 'Function', тогда как' .constructor' ''} '' 'Object' – Esailija

+0

Массивы все еще передают этот« тест » – Ian