Почему комитет javascript решил ввести Object.entries вместо Object.prototype.entries? [Дубликат]

Я написал функцию (debug_display), которая умеет печатать, массивы, объекты и информацию о файле.

<?php
function debug_display($var,$show = false) {
    if($show) { $dis = 'block'; }else { $dis = 'none'; }
    ob_start();
    echo '<div style="display:'.$dis.';text-align:left; direction:ltr;"><b>Idea Debug Method : </b>
        <pre>';
    if(is_bool($var)) {
        echo $var === TRUE ? 'Boolean(TRUE)' : 'Boolean(FALSE)';
    }else {
        if(FALSE == empty($var) && $var !== NULL && $var != '0') {
            if(is_array($var)) {
                echo "Number of Indexes: " . count($var) . "\n";
                print_r($var);
            } elseif(is_object($var)) {
                print_r($var);
            } elseif(@is_file($var)){
                $stat = stat($var);
                $perm = substr(sprintf('%o',$stat['mode']), -4);
                $accesstime = gmdate('Y/m/d H:i:s', $stat['atime']);
                $modification = gmdate('Y/m/d H:i:s', $stat['mtime']);
                $change = gmdate('Y/m/d H:i:s', $stat['ctime']);
                echo "
    file path : $var
    file size : {$stat['size']} Byte
    device number : {$stat['dev']}
    permission : {$perm}
    last access time was : {$accesstime}
    last modified time was : {$modification}
    last change time was : {$change}
    ";
            }elseif(is_string($var)) {
                print_r(htmlentities(str_replace("\t", '  ', $var)));
            }  else {
                print_r($var);
            }
        }else {
            echo 'Undefined';
        }
    }
    echo '</pre>
    </div>';
    $output = ob_get_contents();
    ob_end_clean();
    echo $output;
    unset($output);
}
7
задан Shmiddty 5 November 2012 в 21:57
поделиться

3 ответа

Во избежание коллизий - в общем, проблемы с объектами, которые не имеют свойства со значением, которое вы ожидаете. Объекты в JS часто используются в качестве карт-значений ключей, а ключи могут быть произвольными строками - например, __defineGetter__, hasOwnProperty или что-то менее специальное. Теперь, когда вы хотите вызвать такую ​​функцию на неизвестном объекте, например hasOwnProperty, часто используется в общих функциях перечисления, где любой JSON может быть передан, - вы никогда не можете быть уверены, есть ли у вас перезаписанное свойство (это может даже не быть быть функцией) или оригинал, который вы хотите, или же объект наследует свойство вообще. Чтобы избежать этой проблемы (или также эта ошибка IE ), вам придется использовать Object.prototype.hasOwnProperty.call - это уродливо.

Итак, имена, на которых распространяются все эти функции на Object полезен, это более чистый API, который отделяет методы отражения от интерфейса приложения объекта. Это также помогает оптимизировать (упрощает статический анализ) и упрощает ограничение доступа к API отражения в песочницах - по крайней мере, это была идея дизайна .

Вы можете быть счастливы в прототипе есть defineProperty, но вы можете безопасно использовать его только при работе с известными объектами. Если вы все еще этого хотите (как вы знаете, когда использовать, а когда нет), вы можете использовать

Object.defineProperty(Object.prototype, "defineProperty", {
    writable: true,
    enumberable: false,
    value: function(prop, descr) {
        return Object.defineProperty(this, prop, descr); 
    }
});
7
ответ дан Bergi 31 August 2018 в 12:16
поделиться

Интересно. Единственная причина, по которой я пришел, заключается в том, что людям нравится переписывать прототипы и этот метод «скрытый», подобный этому, может помочь вам избежать некоторых ошибок. Особенно из-за хорошего имени метода, поскольку это, скорее всего, будет перезаписано, чем, например, __defineGetter__.

Кажется, что многие функции зависят от этой функциональности ( link ), поэтому имеет смысл сделать ее более глобальной и безопасной в этом контексте.

2
ответ дан bellpeace 31 August 2018 в 12:16
поделиться

Это делается так, чтобы избежать столкновений - помните, каждый метод на Object.prototype также является методом в каждом отдельном определяемом пользователем объекте.

Представьте объект, в котором вы хотите использовать собственный метод defineProperty - это полностью сломает вещи, когда Object.defineProperty был на своем прототипе.

2
ответ дан ThiefMaster 31 August 2018 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: