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

melky 12.04.2014 11:39

Цитата:

Сообщение от Дзен-трансгуманист
Баг интерфейса в FF28, замечен в винде:

я думал, это фича такая :)

devote 12.04.2014 11:41

Octane,
Твой вариант не будет работать если я сделаю так:
var o = Object.create({}, {});
o[0] = null;
o.hasOwnProperty(0); // false

melky 12.04.2014 11:58

Цитата:

Сообщение от devote (Сообщение 307381)
Octane,
Твой вариант не будет работать если я сделаю так:
var o = Object.create({}, {});
o[0] = null;
o.hasOwnProperty(0); // false

сами проставляем configurable для всех свойств дескриптора?

devote 12.04.2014 12:00

melky,
Зачем? Просто для ИЕ нужно проинициализировать объект

Octane 12.04.2014 12:51

Цитата:

Сообщение от devote
Твой вариант не будет работать если я сделаю так:
var o = Object.create({}, {});
o[0] = null;
o.hasOwnProperty(0); // false

да точно :(

defineProperties только enumerable свойства берет из объекта с дескрипторами

devote, твой вариант не работает, если сделать так:
var desc = Object.create({}, {"0": {}});

var obj = Object.create({}, desc);
obj[1] = 1;

console.log(obj.hasOwnProperty(1));
а если вместо getOwnPropertyNames будем использовать keys, можем случайно удалить non-enumerable свойство. Вряд ли конечно кто-то так будет делать, но хочется 100% вариант)

-----------
наверное лучше getOwnPropertyDescriptor использользовать

Octane 12.04.2014 13:32

//IE9-11 Object.create bug fix
//http://webreflection.blogspot.ru/2014/04/all-ie-objects-are-broken.html
(function () {
	var object = Object.create({});
	object[0] = null;
	return object.hasOwnProperty(0); //→ false in IE9-11
}()) || new 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;
	};
};

devote 12.04.2014 18:54

Octane,
Да отличное решение. Мои тесты все прошел.

nerv_ 12.04.2014 19:06

Цитата:

Сообщение от devote
Да отличное решение.

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

:)

А еще есть вопрос: это
alert(Object.hasOwnProperty)

в каком стандарте написано?

devote 12.04.2014 19:10

Цитата:

Сообщение от nerv_
каком стандарте написано?

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


Да и это тоже смущает:
var object = create(prototype, properties);
Как то все же лучше делать/видеть так:
var object = create.call(this, prototype, properties);
Потому как не сделав этого, мы лишаем прога передать иной контекст. Хотя конечно в данном случае он мало чем поможет.

monolithed 12.04.2014 19:11

Цитата:

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

void function () {
   return {
       // ...
   };
}();

Считаешь, что эта лучшей? ;)


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