[解決済み] オブジェクトの列挙不可能な継承プロパティ名を取得することは可能ですか?
質問
JavaScriptでは、オブジェクトのプロパティを取得する方法がいくつかあり、取得したいものに応じて使い分けています。
1)
Object.keys()
これは、ECMA5メソッドである、オブジェクトのすべての自身の、列挙可能なプロパティを返します。
2) a
for...in
ループで、オブジェクトのすべての列挙可能なプロパティを、それらが自身のプロパティであるか、プロトタイプチェーンから継承されているかに関係なく、返します。
3)
Object.getOwnPropertyNames(obj)
これは、列挙可能かどうかにかかわらず、オブジェクトのすべてのプロパティを返します。
また、以下のようなメソッドもあります。
hasOwnProperty(prop)
は、あるプロパティが継承されているか、実際にそのオブジェクトに属しているかをチェックします。
propertyIsEnumerable(prop)
はその名が示すように、プロパティが列挙可能かどうかをチェックします。
これら全てのオプションでは 非列挙可能、非所有 プロパティを取得する方法はありません。これを行う方法はあるのでしょうか?言い換えれば、私はどうにかして継承された非列挙可能なプロパティのリストを取得することができますか?
ありがとうございます。
どのように解決するのですか?
では
getOwnPropertyNames
は非列挙可能なプロパティを得ることができるので、それを使ってプロトタイプチェーンを歩くことと組み合わせることができます。
function getAllProperties(obj){
var allProps = []
, curr = obj
do{
var props = Object.getOwnPropertyNames(curr)
props.forEach(function(prop){
if (allProps.indexOf(prop) === -1)
allProps.push(prop)
})
}while(curr = Object.getPrototypeOf(curr))
return allProps
}
Safari 5.1でテストしたところ、以下のようになりました。
> getAllProperties([1,2,3])
["0", "1", "2", "length", "constructor", "push", "slice", "indexOf", "sort", "splice", "concat", "pop", "unshift", "shift", "join", "toString", "forEach", "reduceRight", "toLocaleString", "some", "map", "lastIndexOf", "reduce", "filter", "reverse", "every", "hasOwnProperty", "isPrototypeOf", "valueOf", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "propertyIsEnumerable", "__lookupSetter__"]
更新しました。 コードを少しリファクタリングしました(スペース、中括弧を追加し、関数名を改善しました)。
function getAllPropertyNames( obj ) {
var props = [];
do {
Object.getOwnPropertyNames( obj ).forEach(function ( prop ) {
if ( props.indexOf( prop ) === -1 ) {
props.push( prop );
}
});
} while ( obj = Object.getPrototypeOf( obj ) );
return props;
}
関連
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptで現在の日付を取得するには?
-
[解決済み] セレクタの子を取得する方法は?
-
[解決済み] JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントする方法
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] オブジェクトのプロパティを値でソートする
-
[解決済み] 変数を使用してオブジェクトのプロパティに動的にアクセスする
-
[解決済み】未定義のオブジェクトプロパティを検出する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] 無効になっている入力フィールドの値を送信する
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] ECMAScriptとは?
-
[解決済み] 各オブジェクトに?重複
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる