
既存オブジェクトに対してプロパティを追加したいと思っています。
具体的には(後述しますが)ファイル・フォルダオブジェクトに対してです。
(1)自分で作ったオブジェクトの場合
var huga = {};
huga.hoge = "123";
こうするだけで「hoge」プロパティを追加できますよね。
(2)一般的なオブジェクトの場合
Object.prototype.hoge = "123";
とすれば「hoge」プロパティを追加できますよね。
ここまでは知っていました。で、それを踏まえて同じように追加しようと、(1)(2)ともにためしてみたのですがうまくいきませんでした…。
文末のコードでは「item」の配列と、「newName」の配列を別に用意し処理しています。ただ、オブジェクトの意味合いからして、各独立に配列を用意するのはダサすぎます。で、item自体に「newName」プロパティを追加しようと思ったのですがこれがうまくいきませんでした。
◎質問
・この「item」オブジェクトにプロパティを追加することは出来るか
・出来ないのならなぜ出来ないのか。(拡張不可属性とかあるの?)
・出来るのならその方法
※htaアプリなので、IEで動けばOKです。
以上、よろしくお願いします。
<html>
<body>
<input type="button" onclick="ファイル一覧取得()" value="ファイル一覧取得">
<div id="files"></div>
<script>
var folderItemsArray = [];
var newFileNamesArray = [];
// (2)で出来なかった例
// Object.prototype.newName = "123";
// FolderItem.prototype.newName = "123";
// Folder.prototype.newName = "123";
// Item.prototype.newName = "123";
function ファイル一覧取得() {
folderItemsArray = [];
newFileNamesArray = [];
var FOLDER_PATH = "C:\\WINDOWS";
// ★ファイル・フォルダの一覧取得
var shell = new ActiveXObject("Shell.Application");
var folderItems = shell.NameSpace(FOLDER_PATH).Items();
var regOpt = "i";
for (var i = 0; i < folderItems.Count; i++) {
// ↓このオブジェクトに「newName」を追加したい
var item = folderItems.Item(i);
if (!item.IsFolder) {
newFileNamesArray.push("…");
// ↑別配列を操作している辺りがダサい
// ↓本当はこんな感じにしたい。(1)で出来なかった例
// item.newName = "…";
folderItemsArray.push(item);
}
}
一覧表示();
}
/**
* ファイル一覧表示
*/
function 一覧表示() {
var body = '';
for (i = 0; i < folderItemsArray.length; i++) {
var item = folderItemsArray[i];
body += "<tr>";
body += "<td>" + item.Size;
body += "<td>" + item.Name;
body += "<td>" + newFileNamesArray[i];
// ↑別配列を操作している辺りがダサい
// ↓本当はこんな感じにしたい
// tbodyStr += "<td>" + item.newName;
}
var table = '<table border="1" cellspacing="0">';
table += body;
table += "</table>";
document.getElementById("files").innerHTML = table;
}
</script>
</body>
</html>
No.1ベストアンサー
- 回答日時:
fFolder = Shell.NameSpace(vDir )
のNameSpace メソッドで返されるのは、Object実体ではなく、
Objectへの参照(ポインター)だからだと思います。
なるほど…。
# var shell = new ActiveXObject("Shell.Application");
# var folderItems = shell.NameSpace(FOLDER_PATH).Items();
上記で取得できる「オブジェクト」は
JavaScriptの管理下で生成したオブジェクトではなく、
別のプログラム(?)で生成したものの参照だから
ということですね。
そういわれてみれば、そんな気がしてきました。
ってことで、おそらく直接的な解決方法はない
ということですよね…。
ないならないで諦めがつくので「なさそう」
という情報も有用な情報です。
しかしそうであることの確証が無いため
若干すっきりしないところはありますが
参考になりました。ありがとうございました。
No.2
- 回答日時:
IEのスクリプトはさっぱりなので、回答になっていませんが…
itemはobjectのようですが、直接の拡張方法はわからないので、間接的に
var obj = function() {};
obj.prototype = item;
obj.prototype.newName = "...";
return new obj();
みたいな方法を試みてみましたが、うまくいかないみたい。
どうやら
for (i in item) ~~
としてもitem内の属性を取得できないようなので、通常のobjectとはどうも扱いが違うようですね。
以下のように必要な属性をコピーしたobjectを作成してしまえば、一応、ご希望のように扱うことは可能になりますが、別配列を使っていないというだけで大して変わらないかも。
(必要となる属性はattributeで設定しておく)
---------------------------------------
var obj = function(){};
obj.prototype.newName = "...";
obj.attribute = ["Name", "Size", "IsFolder"];
obj.set = function(item) {
var a, i=0, o = new obj();
while (a = obj.attribute[i++]) o[a] = item[a];
return o;
}
var folderItemsArray = [];
function ファイル一覧取得() {
var FOLDER_PATH = "C:\\WINDOWS";
// ★ファイル・フォルダの一覧取得
var shell = new ActiveXObject("Shell.Application");
var folderItems = shell.NameSpace(FOLDER_PATH).Items();
for (var i = 0; i < folderItems.Count; i++) {
var item = folderItems.Item(i);
if (!item.IsFolder) {
folderItemsArray.push(obj.set(item));
}
}
一覧表示();
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 画像の表示位置 3 2022/12/23 08:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScript これは配列ですか
-
C#テキストボックスの文字を配...
-
2つの文字列を比較する方法
-
変数内容が'変数名'の文字列な...
-
undefinedを表示させない方法は...
-
jQueryで文字数カウンタ(複数...
-
郵便番号検索のような
-
復数の配列をJson形式にまとめたい
-
jspからjavascriptの変数引継ぎ
-
javascriptの2次元配列をソート...
-
順列生成アルゴリズムについて...
-
Ajax:getElementsByTagNameで...
-
HTMLで誕生石と星座をアラート...
-
同じIDで定義した要素の配列を...
-
javascript 変数名の連結をしたい
-
連番の変数を参照する方法
-
配列の簡易な記載法ついて
-
既存オブジェクトに対するプロ...
-
JavaScriptからPHPに配列を渡す...
-
JavaScript window.openで開く...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
1から20までの整数から、重複な...
-
空の配列に2次元配列の追加
-
二次元配列を使って順位をだす...
-
C#テキストボックスの文字を配...
-
javascriptからURLパラメータ値...
-
undefinedを表示させない方法は...
-
JavaScriptにおける[] とか :...
-
javascriptで行を抽出したいです。
-
javascriptで2つのArrayの...
-
textareaに入力されたデータを...
-
二次元配列の全要素の全要素を...
-
配列を作って総当たりで距離を...
-
[JS] setAttributeで保存される...
-
順列生成アルゴリズムについて...
-
ソートで
-
重複のない乱数の表示をするには?
-
javascriptで配列の重複判定の...
おすすめ情報