2017-10-19 4 views
1

현재 javascript의 프로토 타입을 사용하여 클래스 상속을 만들려고하고 있습니다. 아래의 간단한 예제에서 어떻게 작동하는지 이해합니다.상위 생성자를 사용하는 Javascript 상속자 매개 변수

var Person = function(){ 
    var name = "Steve"; 
} 

var Employee = function(){ 
    var company = "Stack Overflow"; 
} 

Employee.prototype = new Person; 

var employee1 = new Employee(); 

이제 개체를 만들 때 값을 설정할 수 있도록 생성자에 매개 변수를 추가한다고 가정합니다. 따라서 업데이트 된 코드는 다음과 같습니다.

var Person = function(initName){ 
    var name = initName; 
} 

var Employee = function(initName, initCompany){ 
    //How can I use initName to set the value in the prototype class? 

    var company = initCompany; 
} 

Employee.prototype = new Person; 

var employee1 = new Employee("Bob", "Intel"); 

어떻게 이름을 사용하여 Person 생성자를 호출 할 수 있습니까? C# (내가 가장 익숙한 언어)에서는 기본 생성자를 호출하고 필요한 매개 변수를 전달하지만 javascript에는 동일한 패턴이있는 것처럼 보이지 않습니다.

public class Person 
{ 
    string name; 

    public Person(string initName) 
    { 
     name = initName; 
    } 
} 

public class Employee : Person 
{ 
    string company; 

    public Employee(string initName, string initCompany) : base(initName) 
    { 
     company = initCompany; 
    } 
} 

var employee1 = new Employee("Bob", "Intel"); 

면책 조항 :

참고로

이는 C#에서 어떻게 보이는지 당신이 볼 수 있듯이, 나는 주로 객체 지향 프로그래머,하지만 나는 현재 때문에, 자바 스크립트의 일부를하고 있어요 내가 요구 한 것은 자바 스크립트 관점에서 비관적 일 수 있으며, 필요에 따라 내 전제에 자유롭게 도전 할 수 있습니다.

+0

이 퀘스트를 참조하십시오. [링크 설명 입력] (https://stackoverflow.com/questions/4152931/javascript-inheritance-call-super-constructor-or-use-prototype-chain) ion. 그것은 당신이 찾고있는 모든 것을 가지고 있습니다 –

+0

보십시오 이것 [응답] (https://stackoverflow.com/questions/4152931/javascript-inheritance-call-super-constructor-or-use-prototype-chain). 그것은 당신이 찾고있는 모든 것을 가지고 있습니다. –

답변

1

표준 ES5로하고 예를 들어 특정 경우에 대한

이하이 쓸 수, headmax's answer는 당신이 필요합니까 . 그러나 일반적인 상식 (즉, 클래식 상속)에서 수행하려는 작업은 C# 및 기타 고전 언어 상속 모델에서 가능할 수 있지만 JavaScript Prototype 모델과 같은 방식으로는 불가능합니다. 당신은 아마과 같이, 조성물을 이용하여 그와 가장 가까운를 얻을 수 있습니다 :

var Person = function(initName){ 
    var name = initName; 
} 

var Employee = function(initName, initCompany){ 
    var innerPerson = new Person(initName); 

    var company = initCompany; 
} 

var employee1 = new Employee("Bob", "Intel"); 

그리고, 어떤 추가 기능 당신이 통과로 구현되어야 할 것이다 Person 클래스를 확장 거울이나 Employee 클래스에 구현하려는 것입니다, 즉. 내부 Person 객체에서 상응하는 함수를 호출한다. 틀림없이, 이것은 실제 상속과는 거리가 멀지 만, 다형성과 같은 것들을 위해서 행동을 근사시킬 수 있습니다.

편집 음이 나는 완전히 대해 전에 잊고 뭔가,하지만 당신은 실제로 call() 또는 apply()를 사용하여 상속 동작 조금 더 얻을 수 있습니다.

var Person = function(initName){ 
    var name = initName; 
} 

var Employee = function(initName, initCompany){ 
    Person.call(this, initName); 
    var innerPerson = new Person(initName); 

    var company = initCompany; 
} 

var employee1 = new Employee("Bob", "Intel"); 

을 그러나 당신이 원하는 경우 : 호출을 사용하거나 적용하면 다음과 같이 아이의 맥락에서 부모의 생성자를 실행할 수 있도록, 특정 상황에서 (객체 생성자 포함) 기능을 실행할 수 있습니다 Employee 생성자 내부의 name 속성과 Employee 내부에서 정의하는 다른 함수에 액세스 할 수 있으면 이름 범위 범위를 var name = ...에서 this.name = ...으로 변경하여 생성되는 객체의 범위에서 볼 수 있도록해야합니다 this은 생성자 함수의 범위에 바인딩되는 것과 반대입니다. 이 모든 것을 사용하는 좋은 예는 here을 참조하십시오.ECMAScript를 2015 년 도입과 함께 ES6

, 당신은 이제 더 고전적인 상속처럼 많이 보이는 문법 설탕에 클래스 정의를 포장 할 수 있습니다. 하지만 실제로는 후드 아래에서 프로토 타입 상속으로 구현된다는 사실을 기억해야합니다. call()/apply()이 실행되면 자바 스크립트 엔진이 실제로 코드를 실행하거나 Babel과 같은 transpiler가 다시 작성 될 때 계속 진행될 수 있습니다.

+0

좋아, 나는 단지 내가하고 싶은 것을 할 수 없을 것 같은데, 그러나 구성을 사용하는 대체 접근법에 대해 감사드립니다. 나는 누군가가 더 좋은 대답을 줄 때까지는 그걸로 가야 할 것이다. 그들이 그렇지 않다면 나는 내일 당신들을 받아 들일 것입니다. –

+0

다행 인 구성이 도움이 될 수 있습니다. 그러나 유익하고 상속과 같은 다른 방법을 포함하도록 답변을 업데이트했습니다. –

+0

우수함! Person.call을 사용하고 "var innerPerson"라인을 제거하고 범위를 "var ..."대신 "this ..."로 변경하면 다른 접근 방법보다 원하는 것보다 훨씬 가까워집니다. 기본적으로 내가 원하는 모든 동작을 다룹니다 (특히 하위 클래스에서 원하는대로 함수와 속성을 덮어 쓸 수 있기 때문에) –

1

JavaScript에는 ES6부터 실제 클래스가 있습니다. 그들은 이전 버전의 브라우저 (예 : 인터넷 익스플로러)에서 작동하지 않습니다,하지만 당신은

class Person { 
    constructor(name){ 
    this.name = name; 
    } 
} 

class Employee extends Person { 
    constructor(name, company) { 
    super(name); 
    this.company = company; 
    } 
} 
+0

그래, 이전 버전의 브라우저를 무시하고이 구현을 사용하면 좋겠지 만 불행히도 이전 버전의 JS를 지원해야하므로 사용할 수 없습니다. 이전 버전에서 이와 동일한 작업을 수행 할 수있는 방법이 있습니까? –

+0

바벨 repl을보고 그들이하는 일을 볼 수 있습니다. 그것은 가장 예쁜 것은 아니지만, 확실히 당신이 찾고있는 것을합니다. https://babeljs.io/repl/ –

+0

감사합니다. 유용한 도구입니다. 그것은 덮개 아래에서 명확히 엉망입니다. 그래서 아마 유지하기가 조금 더 쉽기 때문에 아마 Ananth의 접근법을 고수 할 것입니다. –

관련 문제