19.03.2014, 18:51
|
Интересующийся
|
|
Регистрация: 19.03.2014
Сообщений: 14
|
|
Сообщение от nerv_
|
правильней написать так
|
не, родительский конструктор виден будет по цепочке прототипов если он есть так что бакс не обязательно.
Сообщение от Sweet
|
Обрати внимание на название темы. С твоим подходом не получится многоуровневое наследование.
|
Почему? Ты имеешь ввиду нельзя делать цепочки классов? Ведь можно. К прапраметодам ты вообще можешь обратиться как $$methodName, если ты об этом) правда я не знаю зачем это может понадобиться.
Сообщение от nerv_
|
Нет той гибкости
|
ой а можно пример использования гибкости)? у нас по факту нет ни какого super обьекта) если что так. не к чему обращаться. у нас есть прототип в котором хранятся всякие функции. но это не super обьект) да и к томуже не правильно было бы из детей изменять методы суперкласса. имхо. родительский класс вот ДАЛ тебе кучу всего, вто что он дал ты можешь новое добавлять, но не менять или добавлять) это идеологически верно, даже по названию функции extend.
Сообщение от nerv_
|
то можно и миксыны сделать
|
это когда 2 конструктора применяешь к одному обьекту)?
Последний раз редактировалось Maxmaxmaximus11, 19.03.2014 в 18:57.
|
|
19.03.2014, 19:31
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Maxmaxmaximus11
var A = Class.extend(function () {
this.method = function () { }
});
var B = A.extend(function () {
this.method = function () {
this.$method == B.prototype.method; // -> fail!
}
});
var C = B.extend(function () {
this.method = function () {
this.$method == B.prototype.method;
}
});
|
|
19.03.2014, 19:47
|
Интересующийся
|
|
Регистрация: 19.03.2014
Сообщений: 14
|
|
спасибо, баг нашел, короч влом фиксить, все ровно это ни кто юзать не будет. но мой способ поддерживает множественное наследование)
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;
};
//#################################
var Animal = Class.extend(function () {
this.say = function () {
alert('Animal')
}
});
var Cat = Animal.extend(function () {
this.say = function () {
this.$say();
alert('Cat')
}
});
var Ashot = Cat.extend(function () {
this.say = function () {
this.$say();
alert('Ashot')
}
});
new Ashot().say();
|
|
19.03.2014, 19:48
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Maxmaxmaximus11
|
не, родительский конструктор виден будет по цепочке прототипов если он есть так что бакс не обязательно.
|
допустим, есть объект с методом, внутри которого вызывается супер метод
var obj = {
method: function() {
// тут этот объект вызывает свой супер метод
}
};
С твоим подходом проблемы начнутся, если вызвать метод в контексте другого объекта. Т.е. "цепочка" супер методов в лучшем случае не будет вызвана, в худшем нарушена.
<script src="http://nervgh.github.io/js/yum/yum.js"></script>
<script>
/**********************
* CLASSES
* *********************/
/**
* Class Animal
* @param {Number} legs
* @constructor
*/
function Animal(legs) {}
Animal.prototype.destroy = function() {
console.log('Animal.destroy()');
};
// ------------------------
// Inheritance
Object.inherit(Mammal, Animal);
/**
* Class Mammal
* @constructor
*/
function Mammal(legs, teeth) {
// call the Animal constructor
Mammal.super_.apply(this, arguments);
}
Mammal.prototype.destroy = function() {
console.log('Mammal.destroy()');
Mammal.super_.prototype.destroy.call(this);
};
// ------------------------
// Inheritance
Object.inherit(Cat, Mammal);
/**
* Class Cat
* @constructor
*/
function Cat(legs, teeth, tails) {
// call the Mammal constructor
Cat.super_.apply(this, arguments);
}
Cat.prototype.destroy = function() {
console.log('Cat.destroy()');
Cat.super_.prototype.destroy.call(this);
};
/********************
* USAGE / INSTANCE
********************/
var cat = new Cat();
cat.destroy(); // Cat -> Mammal -> Animal;
console.log('--------------------');
cat.destroy.call(this); // Cat -> Mammal -> Animal;
</script>
Сообщение от Maxmaxmaximus11
|
но мой способ поддерживает множественное наследование)
|
нет. Почему, читай тему.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 19.03.2014 в 19:53.
|
|
19.03.2014, 19:52
|
Интересующийся
|
|
Регистрация: 19.03.2014
Сообщений: 14
|
|
ладно ладно) убедили, я просто щас другим занят)) наварганил прямо тут в текстэриа)
|
|
19.03.2014, 20:04
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Цитата:
|
this.$method == B.prototype.method; // -> fail!
|
Sweet, все правильно, потому, что метод с баксом - это метод A.
var A = Class.extend(function () {
this.method = function () { }
});
var B = A.extend(function () {
this.method = function () {
return this.$method === A.prototype.method;
}
});
var C = B.extend(function () {
this.method = function () {
return this.$method === B.prototype.method;
}
});
var b = new B();
var c = new C();
console.log(b.method());
console.log(c.method());
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Последний раз редактировалось nerv_, 19.03.2014 в 20:09.
|
|
19.03.2014, 20:24
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
nerv_, ты написал как должно быть, а я - как происходит при использовании реализации Class.extend Maxmaxmaximus11.
|
|
19.03.2014, 20:35
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Sweet, я говорю, что "fail" происходит правильно в твоем примере.
Или я опять тебя не понял
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
19.03.2014, 20:48
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
nerv_, Все всё поняли.
|
|
|
|