Обновление:. Поскольку это не отвечает, я немного меняю вопрос. Комментарии к сообщению на блоге Dean, указанном ниже, показывают, что этот метод не работает в Safari.
Теперь мой вопрос: работает ли описанная ниже техника * в современных браузерах и, в частности, кто-то может подтвердить, работает ли она в Safari?
Вот более поздний пост в блоге. В какой-то момент он говорит:
Песочницы-туземцы... поддерживаются в различных браузерах, в том числе... Safari 2.0 +
... но позже говорит, что метод iframe "поддерживается всеми главными браузерами, кроме Safari", и сделанный им резерв включает в себя выполнение некоторых странных вещей с фальшивыми конструкторами и __proto__
, которые кажутся немного взломанными.
Мне почти трудно поверить, что два разных окна могут фактически использовать один и тот же, скажем, Object.prototype. Что происходит с междоменными iframe? Если я модифицирую прототипы в одном кадре, измените ли прототипы в другом кадре? Это кажется очевидной проблемой безопасности. Кто-то, пожалуйста, пролил свет на эту ситуацию.
* Под "work" я подразумеваю My.Object != Object
, поэтому прототипы могут быть изменены в одном окне, не затрагивая другого.
Оригинальное сообщение
Я знаю, что это было задано раньше, но у меня есть конкретное решение, и я хочу знать, обсуждался ли этот тип решения раньше и где я могу узнать, насколько он надежный и хорошо принят.
Вопрос заключается в том, как распространять собственные типы в javascript без фактического использования самих типов, поэтому просто изменить Array.prototype не стоит (может быть, другой код используется для... в массивах). Создание поддельного конструктора, возвращающего собственный массив с некоторыми функциями, на которые наложено, не похоже на хорошее решение, фактически расширение внутренних объектов кажется лучше. Но вы также не можете использовать обычное расширение для шаблона-оболочки прототипа javascript-функции с родными типами, потому что вы получите ошибки, такие как "push not generic", когда вы пытаетесь вызвать собственные функции.
Итак, решение, которое я имею в виду, работает следующим образом: создайте другое окно, добавьте функциональность в прототипы собственных конструкторов в этом окне и используйте эти конструкторы в своей программе.
Этот пример расширяет Array
как My.Array
с помощью функции each
и String
как My.String
с помощью функции alert
.
var My = (function(){
// create an iframe to get a separate global scope
var iframe = document.createElement('iframe');
iframe.style.height = '0px';
iframe.style.width = '0px';
iframe.style.border = 'none';
iframe.style.position = 'absolute';
iframe.style.left = '-99999px';
document.documentElement.appendChild(iframe);
var My = iframe.contentWindow;
My.String.prototype.alert = function(){
alert(this);
}
My.Array.prototype.each = function(callback){
for (var i=0, l=this.length; i<l; i++) {
callback(this[i], i);
}
}
return My;
}());
Опять же, мой вопрос заключается в том, обсуждался ли этот подход раньше, что он назвал, где я могу найти больше информации и т.д. Я хотел бы знать, есть ли более чистый способ получить другую глобальную область без использования iframe, или если это возможно, это по какой-то причине сбой в некоторых механизмах javascript, или если кто-то считает это особенно плохой идеей или что-то еще.
Обновление: я думаю, что люди называют этот вид iframe sandbox, чтобы не путать с атрибутом песочницы iframe HTML5.
связаны:
http://dean.edwards.name/weblog/2006/11/hooray/
http://webreflection.blogspot.com/2008/03/javascript-arrayobject.html