2016-04-15 2 views
13

他のオブジェクトの浅いコピーであるオブジェクトプロパティを削除しようとしています。 しかし、私はそれを削除しようとすると、元の値が期待される出力をスローすることはありません。 objからJavascriptオブジェクトのプロパティを削除するには?

var obj = { 
 
    name:"Tom" 
 
}; 
 

 
var newObj = Object.create(obj); 
 
delete newObj.name;//It never works! 
 

 
console.log(newObj.name);//name is still there

+3

どちらも完全に異なるオブジェクトです。 '参照されていない '! – Rayon

+7

'var newObj = obj;'これは期待通りに機能します! – Rayon

+0

docsから、_ Object.create()メソッドは "新しいオブジェクト"を作成します_ – Rayon

答えて

13

newObj継承。

あなたは親オブジェクトにアクセスすることにより、プロパティを削除することができます。

delete Object.getPrototypeOf(newObj).name; 

(親オブジェクトを変更する)

また、(例えば)undefinedに値を設定することで、それをシャドウすることができます:

newObj.name = undefined; 

しかし、プロトタイプは見上げていると、あなたは親オブジェクトからそれを削除せずにNEWOBJのプロパティを削除することはできませんそれが見つかるまで。

+1

' _proto_'の使い方はお勧めしません。ではない? –

+0

私はそれが読んで使用するときに本当に顕著な違いがあるとは思っていませんが、はい、今は推奨されている方法です。 –

+0

お返事ありがとうございました。 – fruitjs

4

基本的にObject.createはオブジェクトを作成し、渡されたオブジェクトごとにそのプロトタイプを設定し、それを返します。だからdeleteObject.createの返されたオブジェクトの任意のプロパティにしたい場合は、そのプロトタイプにアクセスする必要があります。

var obj = { name:"Tom" }; 
var newObj = Object.create(obj); 
delete Object.getPrototypeOf(newObj).name 
console.log(newObj.name); //undefined. 
+0

ChromeのコンソールでOPのコードが正常に動作します。プロトタイプを使用する必要はありません。 – manuell

+0

@manuell私はchromeを使用していますが、意図したとおりに動作していません。 –

+0

あなたは正しいです。 'delete obj.name;'行も実行していました。それがなければ、実際にnewObj(一種)に 'name'がまだあります。 – manuell

関連する問題