Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как определить конструктор вызывающий метод? (https://javascript.ru/forum/misc/56563-kak-opredelit-konstruktor-vyzyvayushhijj-metod.html)

ivanWantsToKnow 22.06.2015 23:33

Как определить конструктор вызывающий метод?
 
К примеру, есть базовый класс Animal, он имеет метод run. От Animal наследуются 2 класса потомка. Как определить какой потомок вызвал метод run? Цель - в зависимости от того, кто вызывает метод run, реализовать разный функционал.

Есть вообще технически такая возможность это узнать? instanceof в любом случае будет по цепочке прототипов искать и будет указывать, что все наследуются от Animal. То есть так не выйдет узнать по идее...

Вот, что я хочу получить. Только в случае с this это, похоже, тоже не работает.
function Animal () {
	this.run = function () {
		if (this === Beaver) {
			console.log('beaver running');
		} else if (this === Deer) {
			console.log('deer running');
		}
	};
}

function Beaver () {
}
Beaver.prototype = new Animal();

function Deer () {
}
Deer.prototype = new Animal();

var deer = new Beaver();
deer.run();

nerv_ 23.06.2015 00:38

Супер-класс не должен ничего знать о классах наследующих от него.
Читай про супер методы.

http://javascript.ru/forum/offtopic/...kriptorov.html

Rise 23.06.2015 01:04

ivanWantsToKnow,
function Animal () {
    this.run = function () {
        if (this.constructor === Beaver) {
            console.log('beaver running');
        } else if (this.constructor === Deer) {
            console.log('deer running');
        }
    };
}
 
function Beaver () {
}
Beaver.prototype = new Animal();
Beaver.prototype.constructor = Beaver;
 
function Deer () {
}
Deer.prototype = new Animal();
Deer.prototype.constructor = Deer;
 
var deer = new Beaver();
deer.run();

tsigel 23.06.2015 08:22

function Animal () {
  console.log('new Animal');
}

Animal.prototype.run = function () {
   console.log('animal runing');
};
 
function Beaver () {
   Animal.apply(this, arguments);
   console.log('new Beaver');
}

Beaver.prototype = new Animal();

Beaver.prototype.constructor = Beaver;

Beaver.prototype.run = function () {
   console.log('beaver runing');
};
 
function Deer () {
  Animal.apply(this, arguments);
  console.log('new Deer');
}

Deer.prototype = new Animal();

Deer.prototype.constructor = Deer;

Deer.prototype.run = function () {
   console.log('deer runing');
};

var deer = new Deer();
var beaver = new Beaver();
deer.run();
beaver.run();

ivanWantsToKnow 23.06.2015 10:04

Всем спасибо! С вашей помощью справился!

jackdempsey2015 23.06.2015 15:44

Animal={
 clone: function(type){var o=Object.create(this); if(type)o.type=type; return o},
 run: function(){alert(this.type+" is running")}
}

Beaver=Animal.clone("Beaver")
Deer=Animal.clone("Deer")

beaver=Beaver.clone()
deer=Deer.clone()

beaver.run()
deer.run()


Часовой пояс GMT +3, время: 16:01.