Хотя JavaScript не предоставляет унаследованные ключевые слова, мы все равно можем придумать несколько хороших способов их реализации.
1. Прототип цепочки наследования:
Кода -копия выглядит следующим образом:
var base = function ()
{
this.level = 1;
this.name = "base";
this.ToString = function () {
вернуть "базу";
};
};
Base.constant = "constant";
var sub = function ()
{
};
Sub.prototype = new Base ();
Sub.prototype.name = "sub";
Преимущества: судя по экземпляру ключевого слова, экземпляр является как экземпляром родительского класса, так и экземпляром детского класса, который, по -видимому, является самым чистым наследием.
Недостатки: подклассы отличаются от свойств и методов родительского класса. Они должны быть выполнены отдельно после операторов, таких как sub.prototype = new Base (); и не может быть завернут в суб -конструктор. Например: sub.prototype.name = "sub"; Множественное наследство не может быть достигнуто.
2. Построить наследование:
Кода -копия выглядит следующим образом:
var base = function ()
{
this.level = 1;
this.name = "base";
this.ToString = function () {
вернуть "базу";
};
};
Base.constant = "constant";
var sub = function ()
{
Base.call (это);
this.name = "sub";
};
Преимущества: может быть реализовано множественное наследство, а атрибуты, уникальные для подклассов, могут быть установлены внутри конструктора.
Недостатки: использование экземпляра обнаружено, что объект не является экземпляром родительского класса.
3. Наследование экземпляра:
Кода -копия выглядит следующим образом:
var base = function ()
{
this.level = 1;
this.name = "base";
this.ToString = function () {
вернуть "базу";
};
};
Base.constant = "constant";
var sub = function ()
{
var encess = new Base ();
exante.name = "sub";
вернуть экземпляр;
};
Преимущества: это объект родительского класса, и тот же эффект может быть получен с помощью новых для построения объектов и без использования новых для построения объектов.
Недостатки: сгенерированный объект по сути является экземпляром родительского класса, а не подклассовым объектом; Множественное наследство не поддерживается.
4. Копировать наследство:
Кода -копия выглядит следующим образом:
var base = function ()
{
this.level = 1;
this.name = "base";
this.ToString = function () {
вернуть "базу";
};
};
Base.constant = "constant";
var sub = function ()
{
var base = new Base ();
для (var i in base)
Sub.prototype [i] = base [i];
Sub.prototype ["name"] = "sub";
};
Преимущества: поддерживает множественное наследство.
Недостатки: низкая эффективность; Невозможно получить методы, которые не могут быть перечислены родительским классом.
Эти формы имеют свои характеристики, и только с точки зрения кода, который я предоставляю, они удовлетворяют следующей таблице:
2012-10: добавлено, если нам не нужно наследование класса, нам нужно только наследство объекта. Для браузеров, которые поддерживают Ecmascript 5, мы также можем использовать метод Object.create для его реализации:
Кода -копия выглядит следующим образом:
var base = function ()
{
this.level = 1;
this.name = "base";
this.ToString = function () {
вернуть "базу";
};
};
Base.constant = "constant";
var sub = object.create (new Base ());
sub.name = "sub";