В javascript мы фактически не имеем классов, а только простые объекты * («хэш-таблицы» -y) с прототипом функциональности. Функции - это какой-то объект (с небольшим синтаксическим сахаром поверх него).
* (не академически правильно говорит, и скрывая некоторые вещи)
Попробуйте пример ниже в отладчике броузера, сделать некоторые проверки
var parent = {
method1: function() { return 1 } ,
method2: function() { return 2 }
}
var child = Object.create(parent)
child.method2 = function() { return '2a' }
child.__proto__ //shows parent
parent.__proto__ //shows Object (the "root class")
child.method3() //undefined is not a function
child.method2() //2a, not 2
child.method1() //method1 not found, looks at __proto__, returns 1
child.toString
//looks at child, not found
//looks at child.__proto__ (parent), not found
//looks at child.__proto__.__proto__ (Object), returns function
Какие классы (от ES2015 и transpilers) примерно сделать чтобы убрать немного кода, который вы должны были бы написать, чтобы получить поведение/стиль программирования class
с других языков, начиная с объектов и прототипов.
В ES2015 объявление класса создает объект «prototype», а new
(или Object.create **) создает объект «экземпляр», который наследует этот propotype.
Теперь вернусь к машинописи ...
var a : { b : string }
a.b = '4'
{ b : string }
только аннотация. Он входит в сферу типов. Скажем, в машинописном тексте у нас есть 2 сферы, область конкретных переменных, которые попадают в сгенерированный код; и область типов, которые используются исключительно для помощи/линтирования, но не будут в конечном итоге в реальном JS. { b : string }
можно ссылаться прочь используя либо interface
или type
синтаксис
type Ta = { b : string } //or
interface Ta { b : string }
var a : Ta
объявляя аннотации типа (которые включают в себя интерфейсы) Добавить нулевой код в конкретной области JS.
..on С другой стороны, когда вы используете class
, машинопись создает как
- конкретный код JS (а именно объект прототип)
- , а также пару жителей типа царства.
TL; DR:
Теперь к ответу, нет большой проблемы в любом из 2-х способов, но с использованием интерфейсов (и меньше классов) склоняется к наиболее распространенному яваскрипту стилю кодирования. Некоторые школы JS выступают против использования классов, поскольку вы можете в основном добиться такого же эффекта с помощью других моделей.
Почему вы бросаете в первом примере? Это необязательно –
Это действительно так, но вопрос остается в силе ;-) – ssougnez
Если вы просто хотите иметь объект со свойствами, то перейдите к первому параметру с интерфейсом, но если вы хотите иметь методы для этого объекта, тогда перейдите к классу –