Забудьте о словах «базовый класс».
В JavaScript функция, которая используется как конструктор (вызывается с ключевым словом new
), может иметь объект-прототип. Элементы объекта-прототипа могут быть вызваны или доступны, как если бы они были членами объектов, созданных этим конструктором.
Простой пример: (http://jsfiddle.net/G2CUp/)
var djangoFett = { // note that Django here is an object,
// not a constructor function and not a "class"
shootBlaster: function() {
alert("Blam! Blam!");
}
};
function CloneTrooper() {
return this;
};
CloneTrooper.prototype = djangoFett; // note that the prototype
// is an object, not a "class"
var myCloneTrooper = new CloneTrooper();
myCloneTrooper.shootBlaster();
В этом примере мы имеем объект djangoFett
, который является прототипом для объектов, созданных с помощью функции CloneTrooper
конструктора. Следует отметить, что djangoFett
- прототип для CloneTrooper
- это объект, а не функция или «класс».
Ваш фрагмент кода отличается, хотя - ваш пример имеет две функции конструктора, поэтому давайте добавим еще одну функцию конструктора, чтобы привести свой фрагмент кода в соответствие с вашими: (http://jsfiddle.net/r28QS/)
function Mandalorian() {
this.shootBlaster = function() {
alert("Blam! Blam!");
}
return this;
};
var djangoFett = new Mandalorian();
function CloneTrooper() {
return this;
};
CloneTrooper.prototype = djangoFett; // note that the prototype
// is an object, not a "class"
var myCloneTrooper = new CloneTrooper();
myCloneTrooper.shootBlaster();
На этот раз djangoFett
ISN 't просто объектный литерал - вместо этого он создается путем вызова функции Mandalorian
при использовании ключевого слова new
.
Вышеупомянутый фрагмент кода очень похож на фрагмент кода, который вы предоставили в своем вопросе. Я только что добавил несколько более явных шагов на этом пути. Re-структуризации кода, чтобы соответствовать свой собственный немного больше:
Mandalorian = function() {};
CloneTrooper = function() {};
CloneTrooper.prototype = new Mandalorian(); // note that the prototype
// is an object, not a "class"
Так что, если я затем изменить значение CloneTooper.prototype.constructor
...
// this is the same as `djangoFett.constructor = CloneTrooper`
// it does not affect the `Mandalorian` constructor function
// in any way whatsoever
CloneTooper.prototype.constructor = CloneTrooper;
... теперь должно быть ясно, что это Безразлично» t влияет на функцию конструктора Mandalorian
(«базовый класс») любым способом. Он затрагивает только один объект, который является экземпляром Mandalorian
.
Итак, почему мы меняем конструктор базового класса? Ответ в том, что мы этого не делаем. Мы меняем конструктор объекта-прототипа. Теперь, почему мы это делаем, это еще одна возможность червей полностью - и there are already questions on SO which address it.
Если «базовый класс» означает «Фрукты» - вы не меняете его конструктор. – Bergi
Мой совет: забудьте про слова «базовый класс». –
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Fcreate#Classical_inheritance_with_Object.create – Tushar