자바 스크립트 : Class.method vs. Class.prototype.method
다음 두 선언의 차이점은 무엇입니까?
Class.method = function () { /* code */ }
Class.prototype.method = function () { /* code using this.values */ }
첫 번째 명령문을 정적 메소드의 선언으로 생각하고 두 번째 명령문을 인스턴스 메소드의 선언으로 생각해도됩니까?
예, 첫 번째 함수는 해당 생성자 함수 의 객체 인스턴스와 아무런 관련이 없으므로 '정적 메소드' 처럼 생각할 수 있습니다 .
JavaScript 함수는 일급 객체이므로 객체처럼 취급 할 수 있습니다.이 경우 함수 객체 에만 속성을 추가하는 것 입니다.
두 번째 함수는 생성자 함수 프로토 타입을 확장 할 때 new
키워드로 작성된 모든 오브젝트 인스턴스에서 사용할 수 있으며 해당 함수 내의 컨텍스트 ( this
키워드)는 호출하는 실제 오브젝트 인스턴스를 참조합니다.
이 예제를 고려하십시오.
// 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();
MyClass 인스턴스를 두 개 이상 만들면 여전히 메모리에 publicMethod 인스턴스가 하나만 있지만 privilegedMethod의 경우 많은 인스턴스가 만들어지고 staticMethod는 객체 인스턴스와 아무런 관련이 없습니다.
이것이 프로토 타입이 메모리를 절약하는 이유입니다.
또한 부모 개체의 속성을 변경하면 자식의 해당 속성이 변경되지 않은 경우 업데이트됩니다.
시각적 학습자의 경우없이 함수를 정의 할 때 .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`
동일한 코드 .prototype
로 추가하면
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`
더 명확하게하기 위해
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
**** 위의 예에서 someInstance.method ()는
ExampleClass.method ()로 인해 오류가 발생하여 실행을 계속할 수 없으므로 실행되지 않습니다.
그러나 설명과 이해를 돕기 위해이 순서를 유지했습니다. ****
에서 생성 된 결과 chrome developer console
&가 위의 코드를 통해 단계에 jsbin 링크를 클릭합니다. 댓글 섹션을 +로 전환JS Bin
ctrl/
예, 첫 번째 static method
는이라고 class method
하고 두 번째는 instance method
입니다.
더 자세히 이해하려면 다음 예를 고려하십시오.
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;
}
위의 코드에서 isPerson
정적 메소드이고 sayHi
의 인스턴스 메소드입니다 Person
.
아래는 Person
생성자 에서 객체를 만드는 방법 입니다.
var aminu = new Person("Aminu", "Abubakar");
정적 방법 사용 isPerson
.
Person.isPerson(aminu); // will return true
인스턴스 방법을 사용 sayHi
.
aminu.sayHi(); // will return "Hi Aminu"
ES6에서
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
static isPerson(obj) {
return obj.constructor === Person;
}
sayHi() {
return `Hi ${this.firstName}`;
}
}
static
static 메소드를 선언하기 위해 키워드가 어떻게 사용 되었는지 살펴보십시오 isPerson
.
Person
클래스 의 객체를 생성합니다 .
const aminu = new Person("Aminu", "Abubakar");
정적 방법 사용 isPerson
.
Person.isPerson(aminu); // will return true
인스턴스 방법을 사용 sayHi
.
aminu.sayHi(); // will return "Hi Aminu"
참고 : 두 예제는 기본적으로 동일하며 JavaScript는 클래스없는 언어로 남아 있습니다. class
에 도입 ES6은 주로 기존의 프로토 타입 기반 상속 모델을 통해 구문 설탕입니다.
참고 URL : https://stackoverflow.com/questions/1635116/javascript-class-method-vs-class-prototype-method
'Programing' 카테고리의 다른 글
C #에서 가장 좋아하는 확장 방법은 무엇입니까? (0) | 2020.02.14 |
---|---|
C ++ 표준은 초기화되지 않은 bool이 프로그램을 중단시킬 수 있습니까? (0) | 2020.02.14 |
R 세션에서 사용 가능한 메모리를 관리하기위한 요령 (0) | 2020.02.14 |
주어진 문자열 패턴을 포함하지 않는 파일은 어떻게 찾습니까? (0) | 2020.02.14 |
토큰 기반 인증이란 무엇입니까? (0) | 2020.02.14 |