2017-12-08 1 views
-1

자바 스크립트를 처음 사용했습니다. 보통 Python/PHP로 작성하십시오. 현재 읽을 거리 : JavaScript : The Definitive Guide : 웹 페이지 활성화 (확실한 안내서).Javascript : 상속 테스트 문제 (JS Definitive Guide 서적에서 제공 한 코드 문제)

사용되는 예제 코드의 일부 나는 이것이 작동하지 않는 이유를 알아 내려고하고 있으며 가능한 경우 자세한 설명은 속성 getter/setters 및 상속보다 아래에 나와 있습니다.

기능 내가 사용 :

function inherit(p) { 
    if (p == null) throw TypeError(); 
    if (Object.create) return Object.create(p); 
    var t = typeof p; 
    if (t !== "object" && t !== "function") throw TypeError(); 
    function f() {}; 
    f.prototype = p; 
    return new f(); 
} 

var p = { 
    x: 1.0, 
    y: 1.0, 
    get r() { 
     return Math.sqrt(this.x*this.x + this.y*this.y); 
    }, 
    set r(newvalue) { 
     var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y); 
     var ratio = newvalue/oldvalue; 
     this.x *= ratio; 
     this.y *= ratio; 
    }, 
     get theta() { return Math.atan2(this.y, this.x); } 
}; 

내가 테스트를 실행

. 나는 상속받는 것을 볼 수 없다.

> var q = inherit(p) 
undefined 
> q 
{} 
> p 
{ x: 1, y: 1, r: [Getter/Setter], theta: [Getter] } 

왜 그렇습니까? 현재 Mac에서 node v6.11.3을 사용하고 있습니다.

업데이트 :

개체의 모든 값을 표시하는 방법을 발견했습니다. 객체에 enumerable:True을 설정하면 모든 값이 자동으로 표시됩니다. 어떻게해야하는지 알아 내려고 노력했습니다. 누구든지 Node.js도 사용하십시오.

+1

코드를 사용하는 방법은 다음과

는 정상적으로 작동합니다. 당신은 제대로 된 결과를보고 있지 않습니다. 'q'를 로그하면 상속 된 모든 속성을 볼 수 있습니다. 당신이보고있는'{}'는 객체가'inherit (p)'에서 반환되었다는 것을 콘솔이 알려주는 방식 일뿐입니다. 코드 하단에'console.log (상속 (p))'를 추가하여 실행하십시오. 또한 ** ** [Fiddle] (https://jsfiddle.net/vpLu0rkh/3/) ** –

+1

네. 또는 클릭하기 쉬운 클릭을 위해 브라우저 콘솔에서 모든 것을 실행하십시오. – Will

+0

JS 스 니펫 코드와 함께 Chrome/FF에서 콘솔을 사용할 수 있다는 것을 깨닫지 못했습니다. 호기심에서,'node'를 사용하면서 터미널에서이 정보를 얻는 쉬운 방법이 있습니까? 나는'console.log (inherit (p))'를 시도했지만 여전히'{}'을 제공한다. 'iPython' 나는 모든 변수를보고 '누가'사용할 수 있고 변수를 빠르게 볼 수 있습니다. – Josh

답변

1

Object.getOwnPropertyDescriptors(Object.getPrototypeOf(q))을 사용하는 경우 상속 된 속성이 p이어야합니다. 평등을 Object.getPrototypeOf()으로 확인하면 q의 프로토 타입은 p과 같아야합니다.

+0

처음에는 아무런 문제가 없었기 때문에 이것은 주석이어야합니다. –

+0

동의하지 않습니다. 문제는 단순히 콘솔에'q '를 입력하여 전체 출력을 볼 수 없다는 것입니다. 이렇게하면 문제가 해결됩니다. – Will

+0

@Will 이런 종류의 문제는 코드와 관련이 없습니다. 문제는 제시된 코드와 아무 관련이 없습니다. 이와 같이, 그것은 여기에서 닫아야 할 질문입니다. (그리고 나는 그것을 그런 것으로 표시했습니다.) 이러한 종류의 질문에는 답변이 아니라 주석이 있어야합니다. –

0

inherit과 같은 이상한 클래스 정의와 인스턴스를 사용하는 것은 좋지 않은 것으로 간주됩니다. 가능한 경우 js 클래스 ES6 정의를 사용하거나 ES5를 사용해야하는 경우 객체 정의 또는 프로토 타입을 사용할 수 있습니다. ES6 클래스 정의

class p { 

    constructor() { 
     this.x = 1.0; 
     this.y = 1.0; 
    }  

    get r() { 
     return Math.sqrt(this.x*this.x + this.y*this.y); 
    } 

    set r(newvalue) { 
     var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y); 
     var ratio = newvalue/oldvalue; 
     this.x *= ratio; 
     this.y *= ratio; 
    } 

    get theta() { return Math.atan2(this.y, this.x); } 

} 

var q = new p(); 
> q 
{x: 1, y: 1} 
> q.r = 6 
> q.theta