Хорошо, посмотрим ...
Мне вдруг стало интересно, почему у нас есть нестатические функции/методы? Метод не является свойством объекта (например, атрибутом/элементом данных), и все экземпляры этого класса используют один и тот же метод, поэтому почему существует дифференциация между статическими и нестационарными методами?
Ключ отметить, что это концептуальная разница. Метод экземпляра «связан» с конкретным объектом при его вызове - он имеет некоторую форму «этого» контекста - в то время как статический метод - нет.
Означает ли это, что когда экземпляр объекта создается, он содержит копию методов, которые являются точными для всех экземпляров этого класса?
Это зависит от языка, но обычно нет.
В Java, например, существует только одна копия метода, совместно используемого для всех экземпляров класса. Методы не являются «частью» данных для экземпляров класса. В JavaScript можно получить этот общий доступ, используя цепочку [[прототип]] или, в меньшей степени, путем повторного использования функции-объекта для того же метода в разных случаях. (Тем не менее, можно также создать новый метод для каждого нового например, в JavaScript, но это выбор программиста.)
В Java «Сообщение» передается для вызова метода экземпляра; то есть он смотрит на конкретный тип и отправляет ему сообщение вместе с соответствующим экземпляром «this». (Это сложнее, чем это из-за виртуальной диспетчеризации, но ... ключ к сведению - есть только один копия метода для определенного типа загружается в память.)
В JavaScript метод a первоклассное значение (это объект), который назван через свойство объекта объекта (или найденного в [[прототипе]]), который динамически связан с ресивером (т. е. внутри установлено на основании как это называется). Python работает аналогично JavaScript в этих методах: первоклассные функции, которые извлекаются и вызывается (но методы по-прежнему «привязаны» к классу, что в отличие от JavaScript). Ruby больше похож на Java в том, что «отправляются сообщения», что в свою очередь вызывает метод (который является не первоклассным значением в Ruby) и неявно связывает контекст с получателем. Все эти языки поддерживают различные формы «подклассификации» (назовите это, как вы можете), чтобы настроить MRO и совместно использовать общие для экземпляров методы.
Метод одинаковый для каждого объекта, только другой объект вызывает метод, поэтому зачем нам нужно сделать часть метода объектом? Почему метод не может быть сохранен один раз (как статический метод), а затем при использовании «this» мы выполняем на соответствующем объекте? Кажется, глупо хранить нестатические методы, являются частью объекта для каждого экземпляра.
Это то, что многие из языка делают - в том числе Java, C++, Python (обычно) и Руби (обычно) и JavaScript (часто), и это очень действительная точка для экономии памяти и накладные расходы.
Счастливое кодирование!
«Метод не является свойством объекта» - это так. Код не дублируется, но он очень важен для существования объекта. –
Вы можете рассматривать его как просто набор статических методов, которые имеют невидимый кадр данных, на которые ссылается «this» :-). – Robinson
Почему у нас есть * статические * функции/методы в Java/C++/OOP? –