【问题标题】:Dynamic Property of JavaScript object?JavaScript对象的动态属性?
【发布时间】:2021-09-26 10:44:23
【问题描述】:

我想知道这在 JavaScript 中是否可行,我想要一个可以包含动态属性的对象。

举个例子:

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?

谢谢。

【问题讨论】:

  • 您为什么明确希望它为“null”? “未定义”还不够吗?
  • 我以为我的应用程序没有取 undefined 值,我刚试过, undefined 做同样的工作,所以我想现在可以关闭它了。谢谢大家。

标签: javascript dynamic prototype properties


【解决方案1】:

不。 JavaScript 不是 Smalltalk。

【讨论】:

  • 然后,我想我应该这样做: MyObject.prototype.getProperty = function(name) { if (this.hasOwnProperty(name)) return this[name];否则返回空值;然后,我会在需要访问时使用 myobj.getProperty(propertyName)。看起来这是最好的选择。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这几乎是您实现目标的最大目标。

    代码:

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

    行为:

    警报:“道具:未定义” 警报:“道具:某事” 警报:“道具:未定义”

    【讨论】:

      【解决方案4】:

      查看 javascript 原型。我认为这会给你至少一些你正在寻找的东西。只需谷歌搜索“javascript原型”即可。

      【讨论】:

        【解决方案5】:

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

        myobj.property2.property3
        

        【讨论】:

          【解决方案6】:

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

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

          您可以利用它来发挥自己的优势。虽然大多数人会声称您应该使用非强制相等运算符 (===),但将 nullundefined 放在同一个存储桶中是最安全的,当然您实际上并不关心两者之间的区别.棘手的地方在于 undefined 是全局对象的属性,因此可以分配一个新值。

          如果有人说undefined = 'donkey',那么null == undefined 将开始返回false。实际上,这几乎从来都不是问题,因为大多数人都不会傻到重新分配 undefined 的值。

          因此,以一种迂回的方式,只要您使用== 将结果与null 进行比较,您就不需要捕获属性访问以返回null 以获取尚未设置的属性。

          【讨论】:

            【解决方案7】:

            是的,但仅限于 2.0 及更高版本。确切的语法仍待定,但看起来至少对于对象字面量来说应该是 get * () {...}

            【讨论】:

            • 为此提供一些源 URL 会很有帮助。到目前为止,我只在 ES.next 中找到了 direct proxies 的规范,它允许 OP 正在寻找什么。
            • 他问的是 JS,而不是 ES。无论如何,JS 2.0 几乎被取消了,ES.next 是浏览器将要实现的。
            【解决方案8】:

            “代理”可以做到这一点

            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
            

            【讨论】:

              猜你喜欢
              • 2020-05-25
              • 1970-01-01
              • 2013-07-21
              • 2020-07-08
              • 2010-10-07
              • 1970-01-01
              • 1970-01-01
              • 2019-11-14
              相关资源
              最近更新 更多