Существует ли “правильный” способ сделать наследование в JavaScript? Если так, что это?

Поскольку EventValue является универсальным, его нельзя использовать непосредственно как тип свойства. * Вы должны либо напрямую указать параметр типа, который дает вам контейнер, который всегда имеет определенное разнообразие EventValue. :

struct DoubleEvent {    // Please pick a better name, though
    let time: Date
    var value: EventValue?
}

Или сделайте контейнер также общим:

struct Event {
    let time: Date
    var value: EventValue?
}

В любом случае вам не нужно явно указывать тип при создании Event: [115 ] Вывод типа заполнит его, когда сам Event является родовым.

(Кроме того: обратите внимание, что у вас нет формального ограничения для T, чтобы быть только Double или Int. Например, let event = Event(time: Date(), value: EventValue(value: "123abc")) также возможен. Если вы действительно хотите этого избежать, ] Ответ Мартина Р. дает одно решение .)


* Не вдаваясь в подробности, это больше похоже на «вещь, которая создает тип», чем сам тип.

9
задан pc1oad1etter 22 October 2008 в 03:03
поделиться

5 ответов

Нет никакого категорического правильного пути, потому что столько людей делает столько разных вещей.. Существует много полезных шаблонов.

Crockford предлагает, чтобы Вы "пошли с мелкой частицей" или записали JavaScript способом, который соответствует prototypal характеру JavaScript.

Конечно, он продолжает показывать, что исходная модель, что предложенный Netscape на самом деле повреждается. Он маркирует это "псевдоклассическим", и указывает на большое неверное направление и ненужную сложность, которая вовлечена в следующий та модель.

Он записал "объектную" функцию как средство (теперь известный как Object.create ()). Это допускает некоторые очень мощные prototypal шаблоны.

Не всегда легко сделать, разрабатывают чистый интерфейс, когда необходимо работать с JavaScript прежней версии, особенно не, когда Вы имеете дело с большими системами, обычно включая несколько библиотек и каждую реализацию уникального стиля и различного шаблона наследования. В целом я сказал бы, что "правильный путь", чтобы сделать наследование является тем, которое позволяет Вам писать чистый интерфейс, который ведет себя хорошо в контексте Вашего унаследованного кода, но также и позволяет Вам осуществлять рефакторинг и устранять старые зависимости со временем.

Рассматривая различия между главными шаблонами библиотеки, я нашел, что самый успешный маршрут для взятия в моей собственной работе должен сохранить мои интерфейсы независимыми от интерфейсов библиотеки полностью. Я буду пользоваться библиотекой или модулем, если это будет полезно, но не будет связано с ним. Это позволило мне осуществлять рефакторинг много кода, постепенно сокращать некоторые библиотеки и пользоваться библиотеками как лесами, которые могут быть оптимизированы позже.

Вдоль этих строк я записал интерфейсы, которые были вдохновлены паразитным шаблоном наследования Crockford. Это - действительно победа для простоты.

С другой стороны монеты, я уверен, что Вы могли привести доводы в пользу выбора библиотеки, осуществления ее через Вашу команду, и соответствующий и ее шаблонам наследования и ее интерфейсным конвенциям.

13
ответ дан 4 December 2019 в 08:02
поделиться

Также проверьте Base.js Dean Edwards. Можно взглянуть на него здесь, сообщение в блоге очевидно.

3
ответ дан 4 December 2019 в 08:02
поделиться

Опытные предложения его собственное берут наследование из http://www.prototypejs.org/api/class/create:

var Animal = Class.create({
  initialize: function(name, sound) {
    this.name  = name;
    this.sound = sound;
  },

  speak: function() {
    alert(this.name + " says: " + this.sound + "!");
  }
});

// subclassing Animal
var Snake = Class.create(Animal, {
  initialize: function($super, name) {
    $super(name, 'hissssssssss');
  }
});
0
ответ дан 4 December 2019 в 08:02
поделиться

Нет никакого класса в JavaScript, только объекты.
Но если Вы настаиваете на том, чтобы эмулировать базирующуюся объектно-ориентированную модель класса, можно использовать это:

function ChildClass() {
    ParentClass.call(this);
    // Write the rest of your constructor function after this point.
};
ChildClass.prototype = jQuery.extend({}, ParentClass.prototype, ChildClass.prototype);

jQuery.extend является 'мелкой копией' функция из библиотеки jQuery. Можно заменить его любой другой функцией копирования/клонирования объекта.

6
ответ дан 4 December 2019 в 08:02
поделиться

Вы смотрите на две разных вещи.

Сначала у Вас есть интерфейсы. Наиболее принятый способ реализовать это состоит в том, хотя Утиный Ввод ("если он похож на утку и шарлатанов как утка затем, это - утка"). Это означает, что, если объект реализует ряд методов интерфейса затем, это - тот интерфейс. Вы реализуете это при наличии массива имен методов, которые определяют интерфейс. Затем, чтобы проверить, реализует ли объект это interfece, Вы видите, реализует ли он те методы. Вот пример кода, который я сделал на скорую руку:

function Implements(obj, inter)
{
    var len = inter.length, i = 0;
    for (; i < len; ++i)
    {
        if (!obj[inter[i]])
            return false;
    }
    return true;
}

var IUser = ["LoadUser", "SaveUser"];

var user = {
        LoadUser : function()
        {
            alert("Load");
        },

        SaveUser : function()
        {
            alert("Save");
        }
    };

var notUser = {
        LoadUser : function()
        {
            alert("Load");
        }
    };

alert(Implements(user, IUser));
alert(Implements(notUser, IUser));

Теперь у Вас есть наследование. JS не имеет никакого встроенного наследования; таким образом, необходимо реализовать его вручную. Это - просто вопрос "копирования" свойств одного объекта другому. Вот другой пример кода (не прекрасный, но он демонстрирует точку):

function InheritObject(base, obj)
{
    for (name in base)
    {
        if (!obj[name])
            obj[name] = base[name];
    }
}

var Base = {
        BaseFunc : function() { alert("BaseFunc from base"); },
        InheritFunc : function() { alert("InheritFunc from base"); }
    }

var Inherit = {
        InheritFunc : function() { alert("InheritFunc from inherit"); },
        AnotherFunc : function() { alert("AnotherFunc from inherit"); }
    }

InheritObject(Base, Inherit);

Inherit.InheritFunc();
Inherit.BaseFunc();
Inherit.AnotherFunc();

Base.BaseFunc();
Base.InheritFunc();

Вы, вероятно, хотите посмотреть на http://www.mootools.net. Это имеет мою любимую реализацию Классов. Вы также определенно хотите проверить "Pro Шаблоны разработки JavaScript"

http://www.amazon.com/JavaScript-Design-Patterns-Recipes-Problem-Solution/dp/159059908X

Эта книга вдается в хорошие подробности о том, как эмулировать ООП в JavaScript.

5
ответ дан 4 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: