12.04.2014, 19:16
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от devote
|
любой объект имеет это свойство по наследству. Ведь конструктор Object тоже является объектом, потому и имеет это свойство. Хотя конечно не спорю, привычнее видеть:
Object.prototype.hasOwnProperty
|
спасибо
Object.prototype.test = 1;
alert(Object.test);
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
12.04.2014, 19:29
|
|
junior
|
|
Регистрация: 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();
}
}());
С английским мог ошибиться, но суть должна быть ясна
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
12.04.2014, 19:30
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Сообщение от devote
|
Как то все же лучше делать/видеть так:
var object = create.call(this, prototype, properties);
Потому как не сделав этого, мы лишаем прога передать иной контекст.
|
Ни один дженерик не привязан к контексту, делать call бессмысленно.
Сообщение от nerv_
|
Меня от этой записи передергивает
new function () {
|
это чтобы от скобочек в глазах не рябило
Сообщение от nerv_
|
ну, например, как-то так
|
не ну так конечно красивее, но в твоем варианте все браузеры создадут объект, у меня просто паранойя по этому поводу
Последний раз редактировалось Octane, 12.04.2014 в 19:34.
|
|
12.04.2014, 19:37
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
nerv_,
Object.prototype[0] = 1;
alert([][0]);
|
|
12.04.2014, 19:49
|
|
junior
|
|
Регистрация: 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
|
не ну так конечно красивее, но в твоем варианте все браузеры создадут объект, у меня просто паранойя по этому поводу
|
Т.е. запускать функцию как конструктор (использовать НЕ по назначению) - это нормально? Вопрос риторический.
Дело не в "красивей". Понятней (как мне кажется).
А объект, как создаться, так и уничтожится, если он не нужен.
Впрочем, это лишь мое мнение
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
12.04.2014, 20:11
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от nerv_
|
Т.е. запускать функцию как конструктор (использовать НЕ по назначению) - это нормально?
|
Это просто инстанс объекта, т.е. идентично:
var foo = function () {};
new foo;
Что тут ненормального?
Последний раз редактировалось monolithed, 12.04.2014 в 20:13.
|
|
12.04.2014, 20:15
|
|
|
Регистрация: 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
|
|
12.04.2014, 20:34
|
Особый гость
|
|
Регистрация: 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.
|
|
12.04.2014, 22:43
|
|
|
Регистрация: 10.07.2008
Сообщений: 3,873
|
|
Кстати, что-то не понял, думал let уже есть во всех браузерах, но почему-то Aurora 30 ошибку выдает. Вроде в Firefox это первым появлялось.
Ждал, что догадаются сделать, чтобы работало так:
let label: {
//local scope
}
и чтобы метка была опциональной, а вся конструкция работала в выражении
window.Anything || let {
…
}
но мечты не сбываются.
Последний раз редактировалось Octane, 12.04.2014 в 22:47.
|
|
12.04.2014, 23:22
|
Особый гость
|
|
Регистрация: 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.
|
|
|
|