JavaScript对象的动态属性?

时间:2009-11-18 00:17:10

标签: javascript dynamic prototype properties

我想知道在JavaScript中这是否可行,我希望有一个可以包含动态属性的Object。

举个例子:

function MyObject()
{
}

var myobj = new MyObject();
myobj.property1 = "something";

alert(myobj.property1); // something
alert(myobj.property2); // this should never report error, instead the property should be evaluated to null, as it has never been set. 

有没有办法拦截JavaScript中的属性调用,所以我可以主动将无值属性设置为null?

感谢。

8 个答案:

答案 0 :(得分:4)

这与实现目标的距离非常接近。

代码:

var obj = {};
alert("prop: " + obj.prop);
obj.prop = "something";
alert("prop: " + obj.prop);
delete obj.prop;
alert("prop: " + obj.prop);

行为:

Alert: "prop: undefined"
Alert: "prop: something"
Alert: "prop: undefined"

答案 1 :(得分:3)

'代理'可以那样做

var myobj = new Object();
var handler = {
    get:function (obj, name, proxyed){
        if(obj[name] !== undefined) // if obj[name] exist
            return obj[name];       // then return obj[name]
        return null; // if obj[name] is not exist then return null;
    }
};
var obj = new Proxy(myobj, handler);
obj.property1 = "something";

alert(myobj.property1); // something
alert(myobj.property2); // undefined

alert(obj.property1); // something
alert(obj.property2); // null

答案 2 :(得分:2)

是的,但仅限于2.0及更高版本。确切的语法仍然是TBD,但它看起来至少对于对象文字是get * () {...}

答案 3 :(得分:1)

不。 JavaScript不是Smalltalk。

答案 4 :(得分:1)

无法拦截JavaScript中的直接属性访问。检索到尚未设置的属性时,结果将为undefined。虽然nullundefined通常被认为是同一件事,但实际上它们是不同的实体。

在JavaScript中undefined表示没有值,null表示值为null。在某些情况下,您可以混合undefined和null。例如,使用==运算符时,它们是等效的((null == undefined) === true)。使用非强制运算符===,它们是不同的((null === undefined) === false)。

您可以利用此优势。虽然大多数人会声称您应该使用非强制平等运算符(===),但将nullundefined置于同一个存储桶中是绝对安全的,当然您实际上并不在乎关于两者之间的区别。令它变得棘手的是undefined是全局对象的属性,因此可以赋予新值。

如果有人说undefined = 'donkey',则null == undefined会开始返回false。在实践中,这几乎不是一个问题,因为大多数人都不愚蠢地重新分配未定义的值。

因此,以迂回的方式,只要您使用{将结果与null进行比较,就不需要对属性访问进行陷阱,以便为尚未设置的属性返回null {1}}。

答案 5 :(得分:0)

否,除非您正在操作由NPAPI插件控制的对象,在这种情况下您可以实现预期的行为。

换句话说,通过NPAPI插件,您可以实现您正在寻找的行为。

答案 6 :(得分:0)

查看javascript原型。我认为这至少可以为你提供一些你想要的东西。只需谷歌“javascript原型”。

答案 7 :(得分:0)

在您的示例中,第二个警报不会生成错误。它只会提醒undefined。访问属性的属性将生成错误:

myobj.property2.property3