重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

既存オブジェクトに対してプロパティを追加したいと思っています。
具体的には(後述しますが)ファイル・フォルダオブジェクトに対してです。


(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>

A 回答 (2件)

 fFolder = Shell.NameSpace(vDir )


のNameSpace メソッドで返されるのは、Object実体ではなく、
Objectへの参照(ポインター)だからだと思います。
    • good
    • 0
この回答へのお礼

なるほど…。

# var shell = new ActiveXObject("Shell.Application");
# var folderItems = shell.NameSpace(FOLDER_PATH).Items();

上記で取得できる「オブジェクト」は
JavaScriptの管理下で生成したオブジェクトではなく、
別のプログラム(?)で生成したものの参照だから
ということですね。

そういわれてみれば、そんな気がしてきました。
ってことで、おそらく直接的な解決方法はない
ということですよね…。

ないならないで諦めがつくので「なさそう」
という情報も有用な情報です。


しかしそうであることの確証が無いため
若干すっきりしないところはありますが
参考になりました。ありがとうございました。

お礼日時:2010/12/27 14:55

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));
}
}
一覧表示();
}
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/11/06 10:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!