новая версия Class, к суперметодам обращаемся через $methodName. если свойство начинается или заканчивается на жетсткий побел, то оно становится не итерируемым. вот и вся суть
function Class(){
}
Class.extend = function (Prototype) {
Prototype.prototype = this.prototype;
constructor.prototype = new Prototype();
constructor.extend = this.extend;
function constructor() {
if (this.constructor) {
this.constructor.apply(this, arguments);
}
for (var key in this) if (this.hasOwnProperty(key) && /(^_)|(_$)/.test(key)) {
Object.defineProperty(this, key, {
value : this[key],
writable : true,
configurable: true,
enumerable : false
});
}
}
for (var key in constructor.prototype) if (constructor.prototype.hasOwnProperty(key)) {
if (/(^_)|(_$)|(constructor)/.test(key)) {
Object.defineProperty(constructor.prototype, key, {
value : constructor.prototype[key],
writable : true,
configurable: true,
enumerable : false
});
}
if (key in this.prototype && typeof this.prototype[key] === 'function') {
Object.defineProperty(constructor.prototype, '$' + key, {
value : this.prototype[key],
writable : false,
configurable: false,
enumerable : false
});
}
}
return constructor;
};
//##############################################################
// проверяем суперметоды
alert('проверяем суперметоды')
var Animal = Class.extend(function () {
this.say = function () {
alert('Animal');
}
});
var Cat = Animal.extend(function () {
this.say = function () {
this.$say();
alert('Cat');
}
});
new Cat().say(); // Animal, Cat
// проверяем приватные
alert('проверяем приватные')
var Animal = Class.extend(function () {
this.say = function () {
};
this._need = function () {
}
});
for (var key in new Animal) alert(key) // say
// проверяем instanceof
alert('проверяем instanceof')
alert( new Cat() instanceof Cat ) // true