Является ли прототип Javascript похожим на статический метод PHP?

Я изучаю Javascript, но у меня есть вопрос о prototype

Является ли прототип в этом случае похожим на статический метод PHP, поскольку все экземпляры его совместно используют?

Javascript

 var Person = function(){ this.name = "Test Person"; } Person.prototype.work = function(){ return this.name + "is working"; } 

PHP

 class Person($personName){ public static working(){ return $personName . "is working"; } } $person1 = new Person("Joe").working(); $person2 = new Person("Mike").wokring(); 

Технический ответ – нет. Основная реализация прототипированной функции – это не то же самое, что реализация статического метода на языке C-типа.

… однако, на практике вы можете считать их общее использование похожим на public-static методы.
Более похожие были бы прототипированные свойства по сравнению с публично-статическими членами.

Они не называются одинаково, но понятие метода или свойства, которое находится на «классе» / конструкторе, и доступно каждому экземпляру и модифицирует эти значения в качестве общих значений, воздействуя на все другие экземпляры, очень , очень похоже на public static .

Однако есть еще несколько вещей, которые нужно помнить, и это будет либо соглашаться с тем, что вы считаете функциональностью public static , в зависимости от используемых вами языков …

Самым важным, конечно, является то, что с точки зрения прототипированных функций у них нет абсолютно никакого доступа к какому-либо частному / конкретному состоянию, которое не является общедоступным .
Поэтому, если вы привыкли иметь дело с public static функциями, которые могут вызвать частные методы или использовать переменные экземпляра (которые не являются публичными), то вам 120% не повезло.

Во-вторых, вы можете создать эквивалент публичных и частных статических членов / методов путем закрытия.

 var Class = (function () { var private_static_method = function () {}, public_static_method = function () {}, private_static_property = 1, public_static_property = 2, class_constructor = function (a, b) { var private_method = function () {}, public_method = function () {}, public_property = a, private_property = b, public_interface = { method : public_method, property : public_property }; return public_interface; }; class_constructor.method = public_static_method; class_constructor.property = public_static_property; return class_constructor; }()); 

Теперь, после закрытия, у меня есть «частные статические» функции и свойства, к которым может обратиться каждый частный экземпляр.
У меня есть общедоступные статические методы, которые я добавил как методы функции конструктора.
Тогда у меня есть функция конструктора, которая не использует new , и просто создает новый объект ( public_interface ), который прикрепляет все, что вы хотите.
Любой из общедоступных методов экземпляра может получить доступ к любым частным методам / переменным этого экземпляра, благодаря закрытию.

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

Не на самом деле нет. Я рекомендую прочитать статью Дуга Крокфорда о прототипном наследовании, чтобы понять, что означает x.prototype в Javascript, и как это может относиться к более «классическому» наследованию. В Википедии есть запись, которая может помочь вам в концепции.