2014-11-21 2 views
0

я задал следующий вопрос о том, почему классы используются в типично бесклассовом прототипном языке наследования как ЯШИ: class use in a prototypal inheritance-based languageJS «классы» против классических классов

Кажется, что они «облегченная запись», потому что массы, как классы ... и что они просто обычные объекты js в фоновом режиме.

Теперь id как знать, какие различия между js поддельными «классами» и классическими классами?

+0

Что вы хотите знать, что не распространяется на _prototypical vs classic inheritance_, с которым вы уже связались? – Mathletics

+1

@Mathletics: Я считаю, что OP хочет знать разницу между «поддельными» классами в javascript (возможно, также и будущим синтаксическим сахаром) и фактическими классами, такими как реализованные на классических языках. EDIT: @ Growler: Я думаю, что все «поддельные» библиотеки классов (не говоря о будущем синтаксическом сахаре) работают несколько иначе .. Сравнение * в глубину * должно быть сделано против 1 (или каждой) конкретной библиотеки. Не могу помочь вам, так как это (по крайней мере, был фильтр хорошего качества) моей политики закрыть * любую * веб-страницу, которая говорит о «классах» в контексте javascript. – GitaarLAB

+0

@GitaarLAB вы только что переформулировали вопрос с большим количеством слов, но не более подробно. Я хочу знать, что OP неясно, прочитав о том, как наследование работает в двух системах. В чем разница между яблоком и апельсином? Или в этом случае яблоко окрасило апельсин и апельсин? – Mathletics

ответ

2

Если бы я сравнивал JS-классы с классами на Java, первое, что я бы сказал, это то, что JS «класс» - это просто объект, тогда как класс Java - это не.

Объект имеет свои свойства/поля/методы. Это то, что может иметь класс JS. Но класс в Java не может, только экземпляры могут.

Некоторые люди, вероятно, скажут «Подождите, но как насчет статических полей и методов? Я могу сделать статическое поле MyClass.myField методом MyClass.doSomething()».

Да, вы можете. Но с моей точки зрения, они просто будут «размещены» в MyClass пространства имен, они не являются действительно свойства класса:

  • У вас нет this в статических методах - но вы можете использовать this методы уровня класса в JS «классы»
  • Вы не можете создать класс со статическим методом для реализации определенного интерфейса - при условии, утке-вводе как интерфейс этого нет никаких проблем в JS

Так класс Java со статическими полями или методами - это просто имяp туз для этих полей и методов, не более того. То, что делает его еще более очевидным является тот факт, что в статическом методе вы не можете выяснить, какой класс вы в (без фокусов):

Getting the class name from a static method in Java

Так что в JS pseudoclasses являются первым -класса, тогда как в Java это не так.

2

Я могу думать об этом, в классовом наследовании, родительские объекты заблокированы. Например:

class A 
{ 
}; 

class B extends A 
{ 
}; 

Здесь определение A «s заблокирован, вы не можете добавлять новые свойства, как только он наследуется.

В 'классах' JavaScript, вы можете:

var o = {x:2}; 
var b = Object.create(o); 
o.y = 5; 
b.y 
>5 

Вы видите, как мы добавили свойство после 'наследования? Это одно отличие, объекты на самом деле не заблокированы (хотя вы можете блокировать объекты с помощью Object.preventExtensions, Object.seal, Object.freeze), но сами по себе объекты могут быть изменены в любой момент времени и эта ссылка на объект-прототип сохраняется в дочернем объекте.

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