Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   FAQ Баги браузеров. (https://javascript.ru/forum/offtopic/33616-faq-bagi-brauzerov.html)

nerv_ 12.04.2014 19:16

Цитата:

Сообщение от devote
любой объект имеет это свойство по наследству. Ведь конструктор Object тоже является объектом, потому и имеет это свойство. Хотя конечно не спорю, привычнее видеть:
Object.prototype.hasOwnProperty

спасибо
Object.prototype.test = 1;
      
alert(Object.test);

nerv_ 12.04.2014 19:29

Цитата:

Сообщение от monolithed
Считаешь, что эта лучшей?

ну, например, как-то так
//IE9-11 Object.create bug fix
//http://webreflection.blogspot.ru/2014/04/all-ie-objects-are-broken.html
(function() {
    var polyfill = {
        isRequired: function() {
            var object = Object.create({});
            object[0] = null;
            return !object.hasOwnProperty(0); //→ false in IE9-11
        },
        apply: function() {
            var create = Object.create;
            Object.create = function(prototype, properties) {
                var object = create(prototype, properties);
                if(!Object.hasOwnProperty.call(object, 0)) {
                    //numeric key fixes a bug,
                    //it can be removed after,
                    //unlike alphabetic key
                    Object.defineProperty(object, 0, {
                        configurable: true
                    });
                    delete object[0];
                }
                return object;
            };
        }
    };

    if(polyfill.isRequired()) {
        polyfill.apply();
    }
}());

С английским мог ошибиться, но суть должна быть ясна :)

Octane 12.04.2014 19:30

Цитата:

Сообщение от devote
Как то все же лучше делать/видеть так:
var object = create.call(this, prototype, properties);

Потому как не сделав этого, мы лишаем прога передать иной контекст.

Ни один дженерик не привязан к контексту, делать call бессмысленно.


Цитата:

Сообщение от nerv_
Меня от этой записи передергивает
new function () {

это чтобы от скобочек в глазах не рябило :D


Цитата:

Сообщение от nerv_
ну, например, как-то так

не ну так конечно красивее, но в твоем варианте все браузеры создадут объект, у меня просто паранойя по этому поводу :)

monolithed 12.04.2014 19:37

nerv_,

Object.prototype[0] = 1;
alert([][0]);

nerv_ 12.04.2014 19:49

Цитата:

Сообщение от monolithed (Сообщение 307432)
nerv_,

Object.prototype[0] = 1;
alert([][0]);

здесь ясно
Object.prototype[0] = 1;
alert([][0]);
alert(''[0]);
alert(0[0]);

Цитата:

Сообщение от Octane
не ну так конечно красивее, но в твоем варианте все браузеры создадут объект, у меня просто паранойя по этому поводу

Т.е. запускать функцию как конструктор (использовать НЕ по назначению) - это нормально? :) Вопрос риторический.
Дело не в "красивей". Понятней (как мне кажется).
А объект, как создаться, так и уничтожится, если он не нужен.

Впрочем, это лишь мое мнение :)

monolithed 12.04.2014 20:11

Цитата:

Сообщение от nerv_
Т.е. запускать функцию как конструктор (использовать НЕ по назначению) - это нормально?

Это просто инстанс объекта, т.е. идентично:
var foo = function () {};
new foo;

Что тут ненормального?

Octane 12.04.2014 20:15

Из вариантов создания локального контекста по условию
namespace.property || new function () {
	…
};

//или

if (!namespace.property) {
	(function () {
		…
	}());
}

//или

(function () {
	if (!namespace.property) {
		…
	}
}());

//или

(function () {
	if (!namespace.property) {
		return false;
	}
	…
	return true;
}());
я выбрал для себя первый

а это
(function () { /*test case*/ }()) || new function () {
	…
};
уже уже вытекающее

я бы конечно написал бы
new function () { /*test case*/ } || new function () {
	…
};
но примитивное значение из конструктора вернуть нельзя, для него автоматически выполнится Object(value), которое будет всегда true

monolithed 12.04.2014 20:34

Цитата:

Сообщение от Octane
но примитивное значение из конструктора вернуть нельзя, для него автоматически выполнится Object(value), которое будет всегда true

Если сильно хочется, то можно так сделать:

alert(+new function () {
   this.valueOf = function () {
      return 1;
   };
});

:)

Цитата:

Сообщение от Octane
Из вариантов создания локального контекста по условию

Можно еще добавить:

namespace.property || void function () {
     ...
}();

Octane 12.04.2014 22:43

Кстати, что-то не понял, думал let уже есть во всех браузерах, но почему-то Aurora 30 ошибку выдает. Вроде в Firefox это первым появлялось.
Ждал, что догадаются сделать, чтобы работало так:
let label: {
    //local scope
}
и чтобы метка была опциональной, а вся конструкция работала в выражении
window.Anything || let {
	…
}
но мечты не сбываются.

monolithed 12.04.2014 23:22

И не говори...

var array = [];

for (let i = 0; i < 2; i++) array.push(() => i);

array[0](); // 0 - Traceur, 2 - FF
array[1](); // 1 - Traceur, 2 - FF


Еще и скобочки лишние () писать нужно :(


Часовой пояс GMT +3, время: 23:32.