Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   self = this в обертке Class (https://javascript.ru/forum/misc/33228-self-%3D-v-obertke-class.html)

DjDiablo 15.11.2012 02:41

пол 6го утра, мне сейчас всё кажется прикольным.
всё я баиньки.

nerv_ 15.11.2012 04:01

https://github.com/kriskowal/es5-shim

bFree 15.11.2012 10:02

Цитата:

То есть ты не должен создавать ни какие промежуточные анонимные функции внутри метода addListener. так как это быдлокод.
Не будь таким категоричным. Иногда это необходимо.
Ладно, я вас понял. Если написать bind для ишака, то можно вполне сносно работать.

Спасибо за ответы

bFree 15.11.2012 10:39

iMaxmaxmaximus, само-собой в контексте )
Просто когда по незнанию писал все в конструкторе, то мой способ решал вопрос и я перестал задумываться об этом. Потом вот всплыла эта интересная особенность ecma

tenshi 17.11.2012 18:46

> То есть ты не должен создавать ни какие промежуточные анонимные функции внутри метода addListener. так как это быдлокод.

bind как раз и создаёт "промежуточную анонимную функцию". причём делает это _каждый раз_.

tenshi 17.11.2012 20:56

Цитата:

Сообщение от bFree (Сообщение 216023)
Нет. Просто хочу, чтобы можно было в коллбеках использовать указатель на объект безо всяких .bind и других доп. конструкций.

идея взята из питона:

<script>


function Method( func ){
    return function Method_instance( ){
        var args= [ this ].concat( [].slice.call( arguments ) )
        return func.apply( null, args )
    }
}

function Trait( scheme ){
    var trait= function Class_trait( ){
        throw new Error( 'Trait can not be instantiate. Create a Class, please.' )
    }
    trait.scheme= scheme
    return trait
}

function Class( scheme ){
    var factory= function Class_factory( ){
        var obj= new Instance
        var init= obj.Class_init
        if( init ) init.apply( obj, arguments )
        return obj
    }
    var proto= factory.prototype
    factory.scheme= scheme
    scheme( proto, factory )
    
    var Instance= function Class_Instance( ){ }
    Instance.prototype= proto
    
    for( var key in proto ){
        if( !proto.hasOwnProperty( key ) )
            continue
        
        var value= proto[ key ]
        if( typeof value === 'function' )
            value= Method( value )
        
        proto[ key ]= value
    }
    
    return factory
}

// проверяем:

var Man= Class( function Man_scheme( man, Man ){
    Man.toString= function( ){
        return 'Man'
    }
    
    man.name= ''
    
    man.Class_init= function( man, name ){
        man.name= name
    }
    man.toString= function( man ){
        return 'Man: ' + man.name
    }
})

var Screamer= Trait( function Screamer_scheme( screamer, Screamer ){
    screamer.scream= function( screamer ){
        alert( screamer + '!' )
    }
    screamer.screamOn= function( screamer, eventName ){
        window.addEventListener
        (   eventName
        ,   function( event ){
                screamer.scream()
            }
        ,   false
        )
    }
})

var Baby= Class( function Children_scheme( baby, Baby ){
    Man.scheme.apply( null, arguments )
    Screamer.scheme.apply( null, arguments )
    
    Baby.toString= function( ){
        return 'Baby'
    }
    
    baby.toString= function( children ){
        return 'Baby: ' + children.name
    }
})

var jim= Baby( 'Jim' )
jim.screamOn( 'load' )

</script>

tenshi 17.11.2012 21:02

Цитата:

Сообщение от iMaxmaxmaximus (Сообщение 216410)
это делает бинд, а не ты! ты не должен создавать РУКАМИ промежуточную функцию потому что это смотрится по уебански.

хороший аргумент, чо :agree:
вот только если использовать в качестве колбэка функцию для этого не предназначенную - будет по уебански работать, что гораздо хуже. а если заводить для колбэка отдельную функцию, то какая разница описывать её методом объекта или замыканием внутри другого метода?

melky 17.11.2012 22:09

... и как только топик стартер столкнулся с этим вопросом, он начал постигать функциональную природу JS

tenshi 17.11.2012 22:27

> че за херь? обрами нормальными тегами [js]

тебе надо - ты и обрамляй)


> разница в красоте кода. какая разница писать очевидным кодом или не очевидным? биндинг функции к контексту это процедура, и она имеет название, она должна быть где-то описана и потмо вызвана. она не должна быть в коде без названия если это конечно не быдлокод, в данном случае мы выносим её в метод бинд.

у тебя биндинг головного мозга) вот я привёл пример кода, куда ты тут всунешь свой bind и зачем?

tenshi 17.11.2012 22:32

ну и дурак)


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