Показать сообщение отдельно
  #26 (permalink)  
Старый 17.11.2012, 20:56
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

Сообщение от bFree Посмотреть сообщение
Нет. Просто хочу, чтобы можно было в коллбеках использовать указатель на объект безо всяких .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:05.
Ответить с цитированием