Modification of javascript inheritance framework
Easy question first : Is it written correctly?

Class.prototype.set = function(attrs) {
  for (var attr in attrs) {
    //if exist setter function this.on_change{key of wrap: function(key of wrap, new value)
    if(this.on_change[attr])this.on_change[attr].call(this,attr,attrs[attr]);
    else this[attr] = attrs[attr];
  }
  return this;
};
if(!Class.prototype.on_change)Class.prototype.on_change={};



attrs is not a good name, it does not contain a list of attributes, but a list of name/value pairs, I would suggest the Spartan o for Object or maybe map.
Dropping the curly braces in your if statement is ok, dropping the newlines not so much
The one line of comment is not very helpful :\
You could use the following for initialization of on_change : 
Class.prototype.on_change = Class.prototype.on_change || {};
on_change is not lowerCamelCase -> onChange would be more idiomatic.


I would counter suggest:

Class.prototype.set = function( map ){
  for ( var attributeName in map ) {
    var value  = map[attributeName],
        setter = this.onChange[attributeName];
    if( setter )
      setter.call( this, attributeName, value );
    else 
      this[attributeName] = value;
  }
  return this;
};
Class.prototype.onChange = Class.prototype.onChange || {};


Hard question: Can you see some undesired behavior? 

Yes.


Providing onChange is old skool, real events use addEventListener.
There are now 2 ways to change a property, thru set and thru changing properties directly. The setter functions only work for set, this will introduce bugs.
You are counting on the setter to do the assignment,  another possible source of bugs. I would do the assignment regardless, rename setter to listener and then execute the listener:

this[attributeName] = value;
if( listener )
  listener.call( this, attributeName, value );