2014-12-16 4 views
0

내 응용 프로그램에서 Javascript의 고급 사용에 중점을두고 있습니다. 그 때문에 나는 j에서 oop을 사용하는 가장 좋은 방법이 무엇인지 많이 연구했습니다. Douglas Crockford way (http://www.crockford.com/javascript/inheritance.html)를 보았습니다. 나는 John Resig way (http://ejohn.org/blog/simple-javascript-inheritance/)를 보았다. 나는 탁월한 책인 "객체 지향 자바 스크립트의 원리"를 Nicholas Zakas가 읽었으며 JS 패턴에 대한 일부 사이트를 읽었으며 솔직히 내가 본 것을 좋아하지 않았습니다. 일부 방법은 너무 장황 해 보였고, 일부는 혼란스럽고, 일부는 너무 이상하게 보였습니다.하지만 모두가 js에서 타당한 방식으로 진행되는 것처럼 보입니다. 몇 가지 다른 OO 언어에서 경험이 있고 수년 동안 oop를 사용합니다. 저는 C++, Java, PHP, Delphi에서 왔습니다. 하지만 Js oop/inheritance 모델은 나에게 정말 지저분 해 보인다. 어쩌면 그것은 단지 그것의 나의 미경험 일뿐입니다. 어쨌든 시작하기에 충분하다고 생각되는 모델을 찾아야합니다. 그래서 생각을 여러 모델을 실험 내가 더 많거나 적은이 일에 자신을 결정 : OOP/상속을하는 것은이 방법이 올 바르고 경우자바 스크립트 상속에 대한 조언

function A() { 
    var x = 15; //private members 
    var y = 20; 
    this.soma = function() { // public member 
     return x + y 
    } 

    this.getX = function() { return x } 
    this.getY = function() { return y } 

} 

function B() { 
     this.mult = function() { // public member 
      return getX() * getY() // inherited public members 
     } 
} 
B.prototype = A() 

b = new B() 

console.log(b.mult()) 

그래서 더 많은 경험 JS 개발자 듣고 싶은 될 것입니다 무슨 그것을하는 더 좋은 방법.

+4

귀하의 질문은 다소 모호합니다. Javascript는 프로토 타입 상속을 사용합니다. 익숙해지기까지 조금 걸립니다. 어떤 특정 문제를 해결하려고합니까? –

+5

"저는 C++, Java, PHP, Delphi에서 왔습니다.하지만 Js oop/inheritance 모델은 정말 엉망입니다." Javascript가 아닌 것처럼 행동하도록 강요하지 마십시오. 즐거운 시간을 보내는 것은 아닙니다. –

+0

이것은 유감입니다. "정확성", "효율성"또는 "개선"에 대한 코드 검사를 원할 경우 http://codereview.stackexchange.com/을 확인하십시오. –

답변

1

나는 거기에 있었어. 내 친구. 그것은 할 수 있지만 시간이 지남에 따라 자바 스크립트가 다른 방식으로 작동하기 때문에 엄밀히 입력 된 객체 지향 패턴을 놓아주는 법을 배울 수 있습니다. 그러나 나중에 그것에 관해서.

상속을 위해 Function.call()을 사용하십시오 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call의 MDN 문서 참조). 기본적으로 상단에 Parent.call(this)을 넣습니다. 이렇게하면 Child 함수에서 this 참조를 사용하여 Parent 함수를 호출합니다. 이 접근법에서는 프로토 타입 상속을 사용하지 않습니다. 모든 멤버 (변수 및 메서드)는 this.member = ...assignment...을 사용하여 추가됩니다. 난 당신의 코드에서 한 줄을 제거하고 다른 추가했습니다 :

다른 제안으로
function A() { 
    var x = 15; //private members 
    var y = 20; 
    this.soma = function() { // public member 
     return x + y 
    } 

    this.getX = function() { return x } 
    this.getY = function() { return y } 

} 

function B() { 
     A.call(this); // ADD THIS LINE 
     this.mult = function() { // public member 
      return this.getX() * this.getY() // inherited public members 
     } 
} 
// REMOVE THIS: B.prototype = A() 

b = new B() 

console.log(b.mult()) 

, 프로그래밍 패러다임은 자바 스크립트에서 다르다. 따라서 Function.call()을 사용하는 것이 유용하지만 클로저 및 이벤트 지향 프로그래밍을 실제로 연구해야합니다. C++과 Java에서 상속을 사용하여 수행 한 많은 것들 (그러나 전부는 아니지만)은 단순히 클로저 컨텍스트 내에서 콜백 함수를 전달함으로써 수행됩니다. 여기서 말하는 상속의 종류는 실제로는 다른 형식의 강력한 입력이지만 JavaScript는 강력한 형식의 언어는 아닙니다.

+0

조언을 주셔서 감사합니다. 하지만 난 jsfiddle에서 제안을 시도하고 작동하지 않았다 : http://jsfiddle.net/nelson777/urofsj17/7/ –

+1

@ NelsonTeixeira :'this.getX()'와'this.getY ()'. 이전에 작동했던 것은 버그 A() 호출의 부작용이었습니다. – Bergi

+1

프로토 타입 할당을 완전히 제거하는 대신,'B.prototype = Object.create (A.prototype) '이어야합니다. – Bergi