gpt4 book ai didi

javascript - 您可以使用自定义对象作为 javascript 中对象的属性吗?

转载 作者:行者123 更新时间:2023-11-30 13:27:22 25 4
gpt4 key购买 nike

假设我创建一个自定义对象/javascript“类”(空引号)如下:

// Constructor
function CustomObject(stringParam) {
var privateProperty = stringParam;

// Accessor
this.privilegedGetMethod = function() {
return privateProperty;
}

// Mutator
this.privilegedSetMethod = function(newStringParam) {
privateProperty = newStringParam;
}
}

然后我想列出这些自定义对象,我可以在其中轻松地添加或删除列表中的内容。我决定使用对象作为存储自定义对象列表的一种方式,这样我就可以将自定义对象添加到列表中

var customObjectInstance1 = new CustomObject('someString');
var customObjectInstance2 = new CustomObject('someOtherString');
var customObjectInstance3 = new CustomObject('yetAnotherString');

myListOfCustomObjects[customObjectInstance1] = true;
myListOfCustomObjects[customObjectInstance2] = true;
myListOfCustomObjects[customObjectInstance3] = true;

并从列表中删除自定义对象

delete myListOfCustomObjects[customObjectInstance1];

但是如果我尝试用

遍历列表
for (i in myListOfCustomObjects) {
alert(i.privilegedGetMethod());
}

我会在 FireBug 控制台中收到一条错误消息,提示“i.privilegedGetMethod() 不是函数”。有没有办法解决这个问题或 javascript 中的成语来做我想做的事?抱歉,如果这是一个愚蠢的问题,但我是 javascript 的新手,并且已经在互联网上搜索过我的问题的解决方案但无济于事。任何帮助将不胜感激!

附言我意识到我的示例非常简单,我可以使用 this.property 或其他东西将 privateProperty 公开,但是我仍然会在警报中得到 undefined,我想将其封装起来。

最佳答案

i 不会是您期望的原始对象:

for (i in myListOfCustomObjects) {
alert(typeof i); // "string"
}

这是因为 JavaScript 中的所有键都是字符串。任何使用其他类型作为键的尝试都将首先被 toString() 序列化。

如果 toString() 的结果对于每个实例来说不是唯一的,它们将都是相同的键:

function MyClass() { }
var obj = {};

var k1 = new MyClass();
var k2 = new MyClass();

obj[k1] = {};
obj[k2] = {};

// only 1 "[object Object]" key was created, not 2 object keys
for (var key in obj) {
alert(key);
}

为了使它们独一无二,定义一个自定义的toString:

function CustomObject(stringParam) {
/* snip */

this.toString = function () {
return 'CustomObject ' + stringParam;
};
}

var obj = {};
var k1 = new CustomObject('key1');
var k2 = new CustomObject('key2');

obj[k1] = {};
obj[k2] = {};

// "CustomObject key1" then "CustomObject key2"
for (var key in obj) {
alert(key);
}

[编辑]

使用自定义 toString,您可以将对象设置为序列化键和值,以保持它们的组织性并继续访问它们:

var customObjectInstance1 = new CustomObject('someString');
var customObjectInstance2 = new CustomObject('someOtherString');
var customObjectInstance3 = new CustomObject('yetAnotherString');

myListOfCustomObjects[customObjectInstance1] = customObjectInstance1;
myListOfCustomObjects[customObjectInstance2] = customObjectInstance2;
myListOfCustomObjects[customObjectInstance3] = customObjectInstance3;

for (i in myListOfCustomObjects) {
alert(myListOfCustomObjects[i].privilegedGetMethod());
}

关于javascript - 您可以使用自定义对象作为 javascript 中对象的属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8015477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com