我正在尝试将名为 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/