СПРАВКИ:
Хорошо, прошло некоторое время с тех пор, как я задал этот вопрос. Как обычно, я все равно пошел и добавил Object.prototype
, несмотря на все допустимые аргументы против него, которые даны как здесь, так и в другом месте в Интернете. Наверное, я просто такой упрямый рывок.
Я пытался придумать неоспоримый способ предотвратить новый метод из-за любого ожидаемого поведения, которое оказалось очень сложным, но информативным.
Я многое узнал о JavaScript. Не в последнюю очередь, я не буду пытаться ничего такого же дерзкого, как возиться с родными прототипами (кроме String.prototype.trim
для IE < 9).
В этом конкретном случае я не использую libs, поэтому конфликты не были моей главной задачей. Но, вырвавшись немного глубже в возможные неудачи, когда вы играете с родными прототипами, я вряд ли попытаюсь использовать этот код в сочетании с любой lib.
Изучая этот прототипный подход, я пришел к лучшему пониманию самой модели. Я рассматривал прототипы как некоторую форму гибкого традиционного абстрактного класса, заставляя меня цепляться за традиционное мышление ООП. Эта точка зрения на самом деле не делает образцовой модели прототипа. Дуглас Крокфорд написал об этой ловушке, к сожалению, розовый фон не позволил мне прочитать полную статью.
Я решил обновить этот вопрос вовремя, люди, которые читают это, испытывают соблазн увидеть самих себя. Все, что я могу сказать, это: во что бы то ни стало. Надеюсь, вы узнаете несколько опрятных вещей, как я, прежде чем решиться отказаться от этой довольно глупой идеи. Простая функция может работать так же хорошо или даже лучше, особенно в этом случае. В конце концов, настоящая красота заключается в том, что добавив всего 3 строки кода, вы можете использовать ту же самую функцию для создания прототипов конкретных объектов все равно.
Я знаю, что я собираюсь задать вопрос, который был вокруг довольно долгое время, но: Почему Object.prototype считается отключенным? Это там, и это может быть дополнено все равно, как и любой другой прототип. Почему бы вам не воспользоваться этим. На мой взгляд, до тех пор, пока вы знаете, что вы делаете, нет причин избегать прототипа объекта.
Возьмите этот метод, например:
if (!Object.prototype.getProperties)
{
Object.prototype.getProperties = function(f)
{
"use strict";
var i,ret;
f = f || false;
ret = [];
for (i in this)
{
if (this.hasOwnProperty(i))
{
if (f === false && typeof this[i] === 'function')
{
continue;
}
ret.push(i);
}
}
return ret;
};
}
В принципе, это тот же старый цикл for...in
, который вы либо сохранили бы в функции, либо напишите снова и снова. Я знаю, что он будет добавлен к объектам all, и поскольку почти каждая цепочка наследования в JavaScript можно проследить до Object.prototype
, но в моем script я считаю это меньшим из двух зол,
Возможно, кто-то мог бы лучше сказать, где я ошибаюсь, чем этот парень и другие.
При поиске причин, по которым люди не прикасались к прототипу Object
, одна вещь продолжала возникать: она прерывает цикл for..in
, но опять же: многие фреймворки тоже не говоря уже о ваших собственных цепочки наследования. Поэтому, по моему мнению, неправильная практика не включать проверку .hasOwnProperty
при переходе через свойства объекта.
Я также нашел этот довольно интересным. Опять же: один комментарий совершенно недвусмыслен: расширение родных прототипов - это плохая практика, но если люди V8 это делают, кто я такой, чтобы сказать, что они неправы?
Я знаю, этот аргумент не совсем складывается.
Дело в том, что я не вижу проблемы с указанным выше кодом. Мне это нравится, его много использовать, и до сих пор он меня не подвел. Я даже подумываю о присоединении еще нескольких функций к прототипу объекта. Если кто-нибудь не скажет мне, почему я не должен, то есть.