2016-11-10 3 views
1

У меня есть оценщик, который возвращает объект, указывающий, показывать или не показывать определенные элементы на странице и содержит более 50 отдельных оценок. Таким образом, нелегко просто взглянуть на него, чтобы обнаружить недопустимое использование элементов объекта. Вот упрощенный пример вопроса, который я хотел бы найти инструмент, чтобы помочь мне адрес:Обнаружение недопустимого использования членов объекта

var simpleExample = { 
    evaluationSet1: { 
     foo: true 
    }, 
    evaluationSet2: { 
     bar: true 
    }, 
    showButton: null 
}; 

//Accidental mis-use 
simpleExample.showButton = simpleExample.evaluationSet1.bar && simpleExample.evaluationSet2.bar; 

В приведенном выше примере, showButton не оценивается должным образом и будет ложным, поскольку evaluationSet1.bar не определен на объект. Правильный синтаксис будет:

simpleExample.showButton = simpleExample.evaluationSet1.foo && simpleExample.evaluationSet2.bar; 

Есть ли инструмент, который может помочь обнаружить такого рода недопустимого потребительной случае? Я попробовал Jshint и Jslint, но ни один из них не смог его пометить.

+1

Машинопись ...... –

+0

Нет, не могу использовать это в нашем приложении, и мы пока не работаем на ECMA6. –

+2

Я в основном шутил. ;-) Я не думаю, что будет инструмент, который может сделать это без более сильной типизации, учитывая динамическую природу javascript. То, что вы написали, является технически обоснованным. Если у параметра оценкиSet1 нет свойства бара, когда вы вызываете оценкуSet1.bar, угадайте, что теперь у вас есть! Это может быть неопределенным, но оно все еще существует. –

ответ

1

Используйте очередь. Если оценка последовательна и требуется, перейдите от evaluationSet1 к evaluationSetN, иначе выполните ошибку. То есть не предоставляйте никакой возможности доступа к любому свойству simpleExample. Предоставьте функцию, которая может получить доступ только к evaluationSet1, который может начать процесс, и может завершить процесс только с evaluationSetN.

Главная нить

const worker = new Worker("worker.js"); 

function handleMessageEvent(event) { 
    if (event.data) { 
    console.log("evaluation is true", event.data) 
    } else { 
    console.log("evaluation is false", event.data) 
    } 
} 

worker.addEventListener("message", handleMessageEvent); 
worker.postMessage("evaluation"); 

Worker нить

function handleWorkerEvent(event) { 
    let bool = true; 
    if (event.data !== "evaluate") { 
    bool = false; 
    self.postMessage(bool); 
    return; 
    } 

    for (let prop of Object.keys(simpleExample)) { 
    let curr = simpleExample[prop]; 
    if (curr) { 
     let keys = Object.keys(curr); 
     if (keys.length) { 
     for (let key of keys) { 
     if (!curr[key]) { 
      bool = false; 
      break; 
     } 
     } 
     } 
    } else { 
     bool = false; 
     break; 
    } 
    } 
    self.postMessage(bool); 
} 

self.addEventListener("message", handleWorkerEvent); 

data.js

const simpleExample = { 
    evaluationSet1: { 
     foo: true 
    }, 
    evaluationSet2: { 
     bar: true 
    }, 
    showButton: null 
}; 

plnkr http://plnkr.co/edit/imPuzjz14lcAFmHHWdRX?p=preview