2017-03-09 4 views
0

jsではオブジェクトを作成しました。オブジェクトのプロトタイプに新しいプロパティを追加したいと思います。プロパティはインスタンスごとに異なります。 値を追加するにはとします。しかし、それは私にエラーを与える。私は以下のコードを追加しました。jsのオブジェクトの新しいプロパティに値を追加することはできますか?

どうすればこの問題を解決できますか?

私はこれを見つけました。私が学んだのはです。は、既存のプロパティに値を追加します。しかし、私は新しいプロパティに値を追加したい、それはインスタンスごとに変化します。

var computer = function (name, ram) { 
 
    this.name = name; 
 
    this.ram = ram; 
 
}; 
 

 
Object.defineProperty(computer.prototype, "graphic", { 
 
    set: function graphic(value) { 
 
     this.graphic = value; 
 
    }, 
 
    get: function graphic() { 
 
     return this.graphic; 
 
    }, 
 
}); 
 

 
var vio = new computer("sony", "8gb"); 
 

 

 
vio.graphic = "gtx980"; 
 

 
console.log(vio.graphic);

エラーマッサージ:あなたはプロトタイプの上に物を置くとき

、:あなたの質問を読み直す

enter image description here

+0

「それは私にエラーを与えます」 - エラーが何かを推測する必要がありますか? –

+0

getter/setterプロパティを独自の名前に設定することはできません。プロトタイプメソッドを迷惑にしているローカル変数を使用するか、 'this.raphic'フロン' this.graphic'を取得/設定してください。 – dandavis

+0

エラー: 'Out of stack space'は明らかです。 firefoxの –

答えて

1

、私は実際の懸念にお答えしますそれらはすべてのインスタンス間で共有されます(クラシックのクラスに追加したようにJavaのようなal言語)。 thisに物を置くと、特定のインスタンスでのみアクセスできます。セッターやゲッターなし

次作品、:

function Computer(name, ram) { // Please use Capital names for constructors 
    this.name = name; 
    this.ram = ram; 
}; 

let vio = new Computer('sony', '8gb'); 
vio.graphic = 'gtx980'; 

graphicプロパティは、そこにいないすべてのコンピュータインスタンス、vioで開催されたインスタンスのために存在します。一方で、あなたがこれを行うにして、場合

function Computer(name, ram) { 
    this.name = name; 
    this.ram = ram; 
} 

Computer.prototype.graphic = 'gtx980'; 

// All instances of Computer will now have a .graphic with the value of 'gtx980'. 
あなたがエラーを取得している理由は、あなたがそれで、あなたがしようとしている、 graphic用セッターを定義することである

graphicに代入するとgraphicの設定者が呼び出され、graphicに割り当てようとすると....あなたがポイントを取得します。

解決策は、実際の変数の名前を変更することです(例:_graphic)。 JSが本当にプライベート変数を持っていない

var computer = function (name, ram) { 
 
    this.name = name; 
 
    this.ram = ram; 
 
}; 
 

 
Object.defineProperty(computer.prototype, "graphic", { 
 
    set: function graphic(value) { 
 
     this._graphic = value; 
 
    }, 
 
    get: function graphic() { 
 
     return this._graphic; 
 
    }, 
 
}); 
 

 
var vio = new computer("sony", "8gb"); 
 

 

 
vio.graphic = "gtx980"; 
 

 
console.log(vio.graphic);

注意。あなたは誰かが_graphicを変更するのを防ぐことができません。

+0

それは動作します。ありがとう。 – zoha131

+0

その背後にある理論を知ることはできますか? 私が 'console.log(Object.getOwnPropertyNames(vio));を呼び出すと、 私はプロパティとしてグラフィックの代わりに_グラフィックを取得します。何故ですか? – zoha131

+0

これは実際のプロパティです。ゲッターとセッターはオブジェクトの実際のプロパティではありませんが、基本的な '_graphic'はあります。 –

関連する問題