JavaScript: Class.metoda A Klasa.prototyp.metoda
Jaka jest różnica między następującymi dwoma deklaracjami?
Class.method = function () { /* code */ }
Class.prototype.method = function () { /* code using this.values */ }
Czy jest w porządku myśleć o pierwszym oświadczeniu jako deklaracji metody statycznej, a drugim oświadczeniu jako deklaracji metody instancji?
5 answers
Tak, pierwsza funkcja nie ma związku z instancją obiektu tej funkcji konstruktora, można ją traktować jak 'metoda statyczna' .
W JavaScript funkcje są Pierwsza klasa obiekty, co oznacza, że możesz traktować je jak każdy obiekt, w tym przypadku dodajesz tylko właściwość do obiektu function .
Druga funkcja, w miarę rozszerzania prototypu funkcji konstruktora, będzie dostępna dla wszystkich instancje obiektów utworzone za pomocą new
słowo kluczowe, oraz kontekst w obrębie tej funkcji (the this
słowo kluczowe) będzie odnosić się do rzeczywistej instancji obiektu, do której ją wywołujesz.
Rozważ ten przykład:
// constructor function
function MyClass () {
var privateVariable; // private member only available within the constructor fn
this.privilegedMethod = function () { // it can access private members
//..
};
}
// A 'static method', it's just like a normal function
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};
MyClass.prototype.publicMethod = function () {
// the 'this' keyword refers to the object instance
// you can access only 'privileged' and 'public' members
};
var myObj = new MyClass(); // new object instance
myObj.publicMethod();
MyClass.staticMethod();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-28 04:19:10
Tak, pierwszy to static method
zwany także class method
, podczas gdy drugi to instance method
.
W ES5
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
Person.isPerson = function(obj) {
return obj.constructor === Person;
}
Person.prototype.sayHi = function() {
return "Hi " + this.firstName;
}
w powyższym kodzie isPerson
jest metodą statyczną, podczas gdy {[6] } jest metodą instancji Person
.
Poniżej, jak utworzyć obiekt z konstruktora Person
.
var aminu = new Person("Aminu", "Abubakar");
Przy użyciu metody statycznej isPerson
.
Person.isPerson(aminu); // will return true
Za pomocą metoda instancji sayHi
.
aminu.sayHi(); // will return "Hi Aminu"
W ES6
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
static isPerson(obj) {
return obj.constructor === Person;
}
sayHi() {
return `Hi ${this.firstName}`;
}
}
zobacz, jak słowo kluczowe static
zostało użyte do zadeklarowania statycznej metody isPerson
.
Aby utworzyć obiekt klasy {[7] }.
const aminu = new Person("Aminu", "Abubakar");
Przy użyciu metody statycznej isPerson
.
Person.isPerson(aminu); // will return true
Przy użyciu metody instancji sayHi
.
aminu.sayHi(); // will return "Hi Aminu"
Uwaga: oba przykłady są zasadniczo takie same, JavaScript pozostaje językiem bezklasowym. Na class
wprowadzony w ES6 jest przede wszystkim cukrem składniowym w stosunku do istniejącego prototypowego modelu dziedziczenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-10 14:50:33
Kiedy utworzysz więcej niż jedną instancję MyClass, nadal będziesz mieć tylko jedną instancję publicMethod w pamięci, ale w przypadku privilegedMethod skończysz tworząc wiele instancji i staticMethod nie ma związku z instancją obiektu.
Dlatego prototypy oszczędzają pamięć.
Ponadto, jeśli zmienisz właściwości obiektu nadrzędnego, odpowiednia właściwość obiektu podrzędnego nie została zmieniona, zostanie ona zaktualizowana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-02 10:08:36
Dla wizualnych uczniów, przy definiowaniu funkcji bez .prototype
ExampleClass = function(){};
ExampleClass.method = function(customString){
console.log((customString !== undefined)?
customString :
"called from func def.");}
ExampleClass.method(); // >> output: `called from func def.`
var someInstance = new ExampleClass();
someInstance.method('Called from instance');
// >> error! `someInstance.method is not a function`
Z tym samym kodem, jeśli .prototype
dodaje się,
ExampleClass.prototype.method = function(customString){
console.log((customString !== undefined)?
customString :
"called from func def.");}
ExampleClass.method();
// > error! `ExampleClass.method is not a function.`
var someInstance = new ExampleClass();
someInstance.method('Called from instance');
// > output: `Called from instance`
Żeby było jaśniej,
ExampleClass = function(){};
ExampleClass.directM = function(){} //M for method
ExampleClass.prototype.protoM = function(){}
var instanceOfExample = new ExampleClass();
ExampleClass.directM(); ✓ works
instanceOfExample.directM(); x Error!
ExampleClass.protoM(); x Error!
instanceOfExample.protoM(); ✓ works
****Uwaga dla powyższego przykładu, someInstance.metoda () nie zostanie wykonana jako,
Przykładmetoda() powoduje błąd i wykonanie nie może być kontynuowane.
Ale ze względu na ilustrację i łatwe zrozumienie, zachowałem tę sekwencję.****
Wygenerowane wyniki od chrome developer console
& JS Bin
Kliknij na link jsbin powyżej, aby przejść przez kod.
Przełącz komentowaną sekcję za pomocą ctrl+/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-10 16:08:06
A. Metoda Statyczna:
Class.method = function () { /* code */ }
-
method()
tutaj jest funkcja właściwość Dodana do innej funkcji (tutaj Klasa). - ty możesz uzyskać bezpośredni dostęp do metody() za pomocą klasy / funkcji nazwa .
Class.method();
-
brak potrzeby tworzenia dowolnego obiektu/instancji (
new Class()
) do uzyskania dostępu do metody (). Więc można to nazwać metodą statyczną.
B. Metoda prototypowa (dzielona na wszystkie instancje):
Class.prototype.method = function () { /* code using this.values */ }
-
method()
tutaj jest funkcja właściwość Dodana do innej funkcja protype (tutaj Klasa.prototyp). - You can albo bezpośredni dostęp przez nazwa klasy lub przez obiekt/instancję (
new Class()
). - Added advantage - ten sposób definicji metody() utworzy tylko jedną kopię metody () w pamięci i będzie dzielony przez Wszystkie obiekt/instancja utworzony z
Class
C. Metoda klasy (każda instancja ma własną kopię):
function Class () {
this.method = function () { /* do something with the private members */};
}
-
method()
tutaj jest metoda zdefiniowana wewnątrz innej funkcji (tutaj Klasa). - nie możesz uzyskać bezpośredniego dostępu do metody() za pomocą klasy / funkcji o nazwie.
Class.method();
- musisz utworzyć obiekt / instancję (
new Class()
) dla dostępu do metody (). - ten sposób definicji metody() będzie Utwórz unikalną kopię metody () dla każdego obiektu utworzonego przy użyciu funkcji konstruktora (
new Class()
). - Added advantage-bcos of the method () scope ma pełne prawo dostępu do lokalnych członków (nazywanych również private członków) zadeklarowanych wewnątrz funkcji konstruktora (tutaj Klasa)
przykład:
function Class() {
var str = "Constructor method"; // private variable
this.method = function () { console.log(str); };
}
Class.prototype.method = function() { console.log("Prototype method"); };
Class.method = function() { console.log("Static method"); };
new Class().method(); // Constructor method
// Bcos Constructor method() has more priority over the Prototype method()
// Bcos of the existence of the Constructor method(), the Prototype method
// will not be looked up. But you call it by explicity, if you want.
// Using instance
new Class().constructor.prototype.method(); // Prototype method
// Using class name
Class.prototype.method(); // Prototype method
// Access the static method by class name
Class.method(); // Static method
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-27 07:32:06