Сообщение от 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>