Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #61 (permalink)  
Старый 12.04.2014, 19:16
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от devote
любой объект имеет это свойство по наследству. Ведь конструктор Object тоже является объектом, потому и имеет это свойство. Хотя конечно не спорю, привычнее видеть:
Object.prototype.hasOwnProperty
спасибо
Object.prototype.test = 1;
      
alert(Object.test);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #62 (permalink)  
Старый 12.04.2014, 19:29
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от 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();
    }
}());

С английским мог ошибиться, но суть должна быть ясна
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #63 (permalink)  
Старый 12.04.2014, 19:30
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

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


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


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

Последний раз редактировалось Octane, 12.04.2014 в 19:34.
Ответить с цитированием
  #64 (permalink)  
Старый 12.04.2014, 19:37
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

nerv_,

Object.prototype[0] = 1;
alert([][0]);
Ответить с цитированием
  #65 (permalink)  
Старый 12.04.2014, 19:49
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от monolithed Посмотреть сообщение
nerv_,

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

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

Впрочем, это лишь мое мнение
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #66 (permalink)  
Старый 12.04.2014, 20:11
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от nerv_
Т.е. запускать функцию как конструктор (использовать НЕ по назначению) - это нормально?
Это просто инстанс объекта, т.е. идентично:
var foo = function () {};
new foo;

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

Последний раз редактировалось monolithed, 12.04.2014 в 20:13.
Ответить с цитированием
  #67 (permalink)  
Старый 12.04.2014, 20:15
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Из вариантов создания локального контекста по условию
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
Ответить с цитированием
  #68 (permalink)  
Старый 12.04.2014, 20:34
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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

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



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

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

Последний раз редактировалось monolithed, 12.04.2014 в 20:50.
Ответить с цитированием
  #69 (permalink)  
Старый 12.04.2014, 22:43
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

Последний раз редактировалось Octane, 12.04.2014 в 22:47.
Ответить с цитированием
  #70 (permalink)  
Старый 12.04.2014, 23:22
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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

var array = [];

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

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


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

Последний раз редактировалось monolithed, 12.04.2014 в 23:24.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт определения мобильных браузеров remkas Элементы интерфейса 0 25.10.2012 15:47
history браузеров d-kaktus Javascript под браузер 1 12.01.2012 00:31
Баги в форме добавления nemo Серверные языки и технологии 0 18.07.2010 13:35
Баги в сниппетах ответов Илья Кантор Сайт Javascript.ru 31 11.06.2009 17:58
feature request: FAQ hogart Сайт Javascript.ru 4 30.01.2009 11:53