Да, просто замени весь шаблон на этот:
|

28.01.2012, 21:13
|
 |
Матрос
|
|
Регистрация: 03.04.2008
Сообщений: 6,246
|
|
|
Сообщение от Livaanderiamarum
|
|
Черт, без __proto__ сложно))
|
да)
|
Сообщение от Livaanderiamarum
|
|
блин, нельзя создать функцию ни чем кроме как конструктром Function((?
|
ну, обычное объявление функции, как function(){}
МОжет еще как-то, но я не в курсе
Кстати, желательно как-раз таки чтобы для таких функций работало(если вдруг способ окажется рабочим только для одного варианта создания функции), как более часто используемых.
Но, у этих функций все равно конструктором является Function, и в качестве прототипа используется Function.prototype
А переопределить этот прототип нельзя - только дополнить
|
|

28.01.2012, 21:20
|
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
function FunctionX(args, body) {
//бейкапим прототип
var temp = Function.prototype
//делаем наш прототип
Function.prototype = {}
//создаем с нашим прототипом, теперь __proto__ ведет именно на наш обьект
var func = new Function(args, body)
//возвращаем старый прототип на место
Function.prototype = temp
//возвращаем свежесозданную функцию
return func
}
var q = FunctionX("", "return 1")
q()
только вот одна мелочь, эта херня не работает((((((((((((((
|
|

28.01.2012, 21:22
|
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
|
Сообщение от Gvozd
|
|
А переопределить этот прототип нельзя - только дополнить
|
а, ну вот и я про то. А почему нельзя? Потому что он встроеный?
|
|

28.01.2012, 21:33
|
 |
Матрос
|
|
Регистрация: 03.04.2008
Сообщений: 6,246
|
|
|
Сообщение от Livaanderiamarum
|
|
только вот одна мелочь, эта херня не работает((((((((((((((
|
да, через это я уже прошел.
|
Сообщение от Livaanderiamarum
|
|
А почему нельзя? Потому что он встроены
|
Без понятия.
Я пришел к этому факту, через эксперимент, но полагаю на этот счет в стандарте написано что-нибудь умное и логичное. Но я пока что не смотрел его в поисках этого вопроса.
Но, судя по-всему придется
|
|

28.01.2012, 21:54
|
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
|
А новые функции должны обладать методами обычных функций?
|
|

28.01.2012, 22:09
|
 |
Матрос
|
|
Регистрация: 03.04.2008
Сообщений: 6,246
|
|
|
Сообщение от Livaanderiamarum
|
|
А новые функции должны обладать методами обычных функций?
|
Желательно.
Но в обычных функциях методы из прототипа приходят, так что вопрос хороший.
Наверно из-за этого и не дается его перегрузить
Но, на крайняк можно нафаршировать новую функцию нужными методами напрямую, либо указать в качестве прототипа прототипа - обычную функцию.
Так, что допустим, что необязательно обладать методами.
Достаточно чтобы она просто умела выполнятся.
|
|

28.01.2012, 22:40
|
|
|
Регистрация: 09.07.2008
Сообщений: 3,873
|
|
|
Сообщение от Gvozd
|
Так, что допустим, что необязательно обладать методами.
Достаточно чтобы она просто умела выполнятся.
|
Да так не интересно, можно и в iframe напичкать Function.prototype своими методами и достать от туда. Хочется, чтобы изменения в обоих прототипах отражались на созданной функции…
|
|

28.01.2012, 22:40
|
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Почти доделал
-------------------------------------------
|
Сообщение от Octane
|
|
можно и в iframe напичкать Function.prototype
|
я так и сделал) но замыкание. функции созданые во фрейме замыкают его область видимости? даже with не помогает
-------------------------------------------
<body>
<script>
function FunctionX(arg, bod) {
var alert = alert
var el = document.createElement("iframe");
document.body.appendChild(el);
var proto = arguments.callee.prototype
for ( var i in proto) {
window.frames[0].Function.prototype[i] = proto[i]
}
var func = window.frames[0].Function(arg, bod)
window.document.body.removeChild(el)
return func
}
FunctionX.prototype.qq = function() {
alert('НЯЯЯ)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111')
}
var q = FunctionX('', 'alert("fff")')
q()
</script>
</body>
не работает потому что алерта в айфрейме больше нет
Последний раз редактировалось Octane, 28.01.2012 в 23:11.
Причина: Объединение сообщений
|
|

28.01.2012, 22:53
|
|
|
Регистрация: 09.07.2008
Сообщений: 3,873
|
|
Напрашивается вопрос:
раз уж есть стандартное средство получить __proto__
var x = {};
alert(Object.getPrototypeOf(x) === x.__proto__);
и есть способ создать новый объект, с указанным __proto__
var x = Object.create(Function.prototype);
alert(x.__proto__ === Function.prototype);
то почему стандарт не предусматривает метод для изменения __proto__ созданного объекта?
|
|

28.01.2012, 22:56
|
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от Octane
|
Напрашивается вопрос:
раз уж есть стандартное средство получить __proto__
var x = {};
alert(Object.getPrototypeOf(x) === x.__proto__);
и есть способ создать новый объект, с указанным __proto__
var x = Object.create(Function.prototype);
alert(x.__proto__ === Function.prototype);
то почему стандарт не предусматривает метод для изменения __proto__ созданного объекта?
|
или почему метод не позволяет делать так
Object(обьект, егоПрототип)
или почему нет метода вот так
Обьект.chengePrototype(новыйПротоÑ ‚ип)
|
|
|
|