클래식 대 프로토 타입… 어떻게 그렇게 다릅니 까?
-
06-07-2019 - |
문제
예를 들어 PHP에서
class foo{
function foo($name){ //constructor
$this->name=$name;
}
function sayMyName(){
return $this->name;
}
}
class bar extends foo{
function sayMyName(){
return "subclassed ".$this->name;
}
}
그리고 JS에서
function foo(name){
this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};
function bar(){}
bar.prototype=new foo();
bar.prototype.sayMyName=function(){return "subclassed "+this.name};
나는 JavaScript를 처음 사용합니다. 그래서 저를 깨달으십시오. 기능적으로 동일하지 않습니까, 아니면 거대한 것을 놓치고 있습니까?
그들이 동일하다면, 고전적은 프로토 타입과 어떻게 다릅니 까?
미리 감사드립니다 ...
해결책
JavaScript에서는 프로그램이 실행될 때 상속을 변경할 수 있습니다. 클래식 프로그래밍에서는 할 수 없습니다. 예를 들어:
function foo(name){
this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};
function foo2(name){
this.name = name;
}
foo2.prototype.sayMyName = function(){return "My name is "+this.name;};
function bar(){}
bar.prototype = new foo();
var myBar = new bar();
myBar.name = "Marius";
alert(myBar.sayMyName());
bar.prototype = new foo2();
var myBar2 = new bar();
myBar2.name = "Marius";
alert(myBar2.sayMyName());
다른 팁
JavaScript (올바르게 지적한대로)는 특정 유형의 OOP를 사용합니다. 프로토 타입 기반. JavaScript에서는 클래스를 생성하지 않으므로 기존 객체를 복제하고 프로토 타입에 멤버를 추가하여 증강합니다.
PHP에서는 새로운 객체에 대한 청사진 인 클래스를 생성합니다.
나는 Andrew Hare와 Marius를 보증합니다. 수업이 런타임에 수정하여 클래스가 할 수있는 일을 바꿀 수 있다는 것입니다. 클래식 OOP는 그렇게 할 수 없으며, 클래스/객체가 수행 할 수있는 일과 컴파일 전 또는 해석되기 전에 (해석 된 언어 인 경우) 정확히 어떤 데이터 속성을 지정해야합니다 (해석 된 언어).
제공 한 코드는 기능적으로 동일하지만 JS의 프로토 타입을 활용하지 않았기 때문입니다.
수업 기반 상속
- 클래스와 인스턴스는 별개의 엔티티입니다.
- 클래스 정의로 클래스를 정의합니다. 생성자 방법으로 클래스를 인스턴스화합니다.
- 새 연산자와 함께 단일 객체를 만듭니다.
- 구성 클래스 정의를 사용하여 객체 계층 기존 클래스의 서브 클래스를 정의합니다.
- 다음으로 속성을 상속합니다 클래스 체인.
- 클래스 정의는 클래스의 모든 인스턴스의 모든 속성을 지정합니다. 실행 시간에 동적으로 속성을 추가 할 수 없습니다.
프로토 타입 기반 상속
- 모두 객체는 인스턴스입니다.
- 생성자 함수로 객체 세트를 정의하고 만듭니다..
- 새 연산자와 함께 단일 객체를 만듭니다.
- 건설하다 객체를 프로토 타입으로 할당하여 객체 계층 생성자 함수와 관련이 있습니다.
- 다음으로 속성을 상속합니다 프로토 타입 체인.
- 생성자 함수 또는 프로토 타입 초기 속성 세트를 지정합니다. 속성을 동적으로 추가하거나 제거 할 수 있습니다 개별 객체 또는 전체 객체 세트에.
제휴하지 않습니다 StackOverflow