2013-05-29 5 views
2

При создании шаблона наследования в JS, например следующим образом: -Javascript наследования конструктор

var Fruits = function(){}; 
var Apples = function(){}; 
Apples.prototype = new Fruits; 
Apples.prototype.constructor = Apples; 

Почему мы изменяем конструктор базового класса?

+2

Если «базовый класс» означает «Фрукты» - вы не меняете его конструктор. – Bergi

+4

Мой совет: забудьте про слова «базовый класс». –

+0

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

ответ

1

В этом примере яблоко наследует конструктор фруктов. Линия Apples.prototype = new Fruits означает, что любое будущее Apple будет создано как плод. Следующая строка устанавливает конструктор Apple в конструктор фруктов. Вы можете сделать то же самое с прототипом, но тогда это повлияет только на один экземпляр

0

Забудьте о словах «базовый класс».

В 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.

+0

«Теперь, почему мы делаем это, это еще одна возможность работы полностью» - основная часть. Ссылка, которую вы дали, не очень помогла понять, почему она рекомендована в наследовании – Tushar

Смежные вопросы