当前位置: 首页 > 面试题库 >

在对象上定义吸气剂,因此所有未定义的属性查找均返回“”

马清野
2023-03-14
问题内容

基本上,我需要能够做到这一点:

var obj = {"foo":"bar"},
    arr = [];
with( obj ){
   arr.push( foo );
   arr.push( notDefinedOnObj ); // fails with 'ReferenceError: notDefinedOnObj is not defined'
}
console.log(arr); // ["bar", ""] <- this is what it should be.

我正在寻找一个等于{}.__defineGetter__
或{get}的“全局”对象,以便为所有未定义的属性获取器返回一个空字符串(请注意,这与的属性不同undefined)。


问题答案:

您可以创建一个a,Proxy以在访问未定义的属性时返回空字符串。

app.js

var obj = {"foo":"bar"},
    arr = [],
    p = Proxy.create({
        get: function(proxy, name) {
            return obj[name] === undefined ? '' : obj[name];
        }
    });
arr.push( p.foo );
arr.push( p.notDefinedOnObj );

console.log(arr);

正如问题作者David
Murdoch指出的那样,如果您使用的是节点v0.6.18(撰写本文时是最新的稳定版本),则--harmony_proxies在运行脚本时必须传递该选项:

$ node --harmony_proxies app.js
[ 'bar', '' ]

请注意,此解决方案将 不会 ,如果你使用的工作with,如:

var obj = {"foo":"bar"},
    arr = [],
    p = Proxy.create({
        get: function(proxy, name) {
            return obj[name] === undefined ? '' : obj[name];
        }
    });
with ( p ) {
   arr.push( foo ); // ReferenceError: foo is not defined
   arr.push( notDefinedOnObj );
}

console.log(arr);

with将代理get添加到作用域链时,似乎没有调用代理的方法。

注意:Proxy.create()在此示例中传递给的代理处理程序 不完整
。有关更多详细信息,请参见代理:常见错误和误解。



 类似资料:
  • 问题内容: 检查JavaScript中的对象属性是否为最佳方法是什么? 问题答案: 检查属性值是否为特殊值的通常方法是: 要检查对象是否实际上没有这样的属性,并因此在尝试访问它时默认情况下将返回: 检查与标识符关联的值是否为特殊值, 或者 尚未声明该标识符。注意:此方法是引用 未声明的标识符(注意:与的值不同)的唯一方法,且不会出现早期错误: 在ECMAScript 5之前的JavaScript版

  • 默认行为是,尝试访问不存在的对象的属性会生成错误: 如果组织未定义,将生成错误。当试图访问一个不存在的对象的属性时,有没有一种方法可以改变这个默认行为并只接收未定义的?有时,它比记住检查对象是否已定义更有帮助

  • 问题内容: 当getter返回一个属性(例如返回其他相关对象的a)时,该列表及其对象是否应该是不可变的,以防止类外部的代码更改这些对象的状态而又不知道主要的父对象? 例如,如果一个对象,具有吸气剂,它返回一个的目的,那么任何码调用该吸气剂: 可以在对象不知道的情况下从该列表中删除对象。 可以在对象不知道的情况下更改每个对象。 那么我们应该在这里做什么?我们应该只相信调用代码并返回容易可变的对象,还

  • 我之前问过这个问题,它与这个问题相关(如何从异步调用返回响应?),但它并没有解决我的问题 我是node.js的新手,我遇到了一些我无法处理的错误,或者找不到任何我理解的帮助。我使用express generator初始化应用程序。我试图通过一个api调用将我得到的对象发送到前端。我编写了一个类“StockClass.js”,其中包含一个函数makeApiCall(),该函数进行调用并返回对象。但当

  • 问题内容: 我正在借助以下方法设置新的React:https : //github.com/facebookincubator/create-react- app 但是,我遇到了一个棉绒问题。我收到以下掉毛错误。 这是导致问题的代码: 我试着使用react / prop-types规则,但无济于事。 问题答案: 根据这个问题发表评论。 这似乎是因为您在安装时仅应使用create-react- ap

  • 问题内容: 有人可以帮助我迅速了解正确使用吸气剂和吸气剂的方法。我对它的印象与说Java不一样。 这是Swift中用于存储和访问类变量的正确用法吗? 问题答案: 斯威夫特提供了更结构化的方法来和比Java。 你可以,但你应该 不会 ,写getter和setter方法就像你在你的代码一样。 相反,(如果您使用)只需声明可见性为non的属性即可(例如,在我的示例中)。这样,您班级外的呼叫者将可以查看属