2017-12-08 2 views
-1

Javascriptを初めて使用しています。通常Python/PHPを書いてください。現在読んでいるのはJavaScript:The Definitive Guide:あなたのWebページを有効にする(確定ガイド)Javascript:継承テストの問題(JS Definitive Guide bookが提供するコードの問題)

私はそれがうまくいかない理由を理解しようとしています。なぜ可能なかについての詳細な説明は、プロパティgetter/setterと継承の下にあります。

私が使用している機能:

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(inherit(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になります。と等しいかどうかを確認する場合、プロトタイプqpに等しくなければなりません。

+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