javascript - 无法使用点符号或索引器符号向对象添加属性?

标签 javascript

我正在尝试将名为 params 的属性添加到名为 Page 的类的名为 url 的属性中。必须为属性 params 分配匿名函数的返回值。

该函数运行良好。

但是,在分配函数的返回值之后,当我检查是否已分配属性 params 时,我在 watch 中没有看到这样的属性窗口或控制台中。当我尝试从 url 属性读回属性 params 时,我得到 undefined

这是为什么呢?无论我使用点符号还是索引器符号向属性写入/分配值,都会发生这种情况。下面是我的代码:

var app = 
{
    ...
};

$(document).ready(function() {
    var page = new Page(app);
    page.display();
});

var Page = function(app) {

    this.url = window.location.href;
    this.app = app;

    this.url.params = (function() {

        var p = { };

        if (this.indexOf('?') < 0) return p;

        var query = this.split('?')[1];

        var pairs = query.split('&');

        if (pairs === undefined || pairs.length == 0) return p;

        for(var i = 0; i < pairs.length; i++) {
            var pair = pairs[i].trim();

            if (pair.length == 0) continue;

            if (pair.indexOf('=') < 0) {
                p[pair[0]] = '';
            }
            else {
                var prop = pair.split('=');

                p[prop[0]] = prop[1];
            }
        }

    }.bind(this.url))();

    this.display = function() {

        debugger;

        // over here, when I watch 'url', it does
        // not have a 'params' property
    };
};

最佳答案

将属性分配给原始字符串值不会导致错误。相反,它在内部将字符串类型提升为 String 对象,执行赋值,然后丢弃 String 对象。

这样做的原因是为了能够在原始字符串值上使用 String.prototype getter 和方法。 (类似的注意事项适用于对原始数字类型值使用 Number.prototype 方法)

就你的情况

this.url = window.location.href;

this.url 设置为原始字符串值。然后,当您将 url.params 设置为函数时,它会在内部有效地被视为

new String(this.url).params = function () ....

出于赋值的目的,但在执行语句后创建的 String 对象将被丢弃。 this.url 中的原始值不会获得属性 - 它不是对象数据类型并且没有属性。

关于javascript - 无法使用点符号或索引器符号向对象添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40752038/

相关文章:

javascript - 无限滚动更新后附加事件处理程序

javascript - 使用 JavaScript 在父窗口中隐藏弹出窗口

javascript - 使用 jQuery/JavaScript 加载页面时使元素消失

javascript - 用户离开页面时如何发送ajax请求

javascript - 如何动态设置div的值

javascript - 在javascript中解析json

javascript - keypress 和 keydown 优先于 Firefox 和 Safari 中的粘贴事件

javascript - 如何在 JavaScript 中一次打开多个窗口?

javascript - 将数据填充到material-ui下拉列表React JS

asp.net 下拉列表 - C#.NET 和 javascript