我试图模仿一个非常简单的浏览器环境,模仿浏览器对location
变量中用户变化的反应。据我所知,用户可以改变
self.location
location
document.location
window.location
通过
导航当前窗口的其中一个self.location = 'http://www.google.com'
)href
(例如self.location.href = 'http://www.google.com'
)所以我真正的问题是如何实例化浏览器环境以允许用户分配位置变量,无论如何他们希望并让我稍后检索位置变量?对不起,如果这听起来很愚蠢,(我之前从未在javascript中编码),但在现实世界的情况下,浏览器是否通过宏将字符串数据转换为位置对象,或者Javascript是否具有某种“隐式构造函数”机制,可以自动调用构造函数一个类只是通过赋值?
(我知道有dom库可用,但我觉得它们太过分了,因为我只对导航机制感兴趣。)
答案 0 :(得分:1)
嗯,这里有几个不同的答案。
首先,在检索location
时,不要期望在同一页面上。
如果用户更改了它的值,那么您的页面将会更改(以及您的内存中应用程序),因此您需要使用某种形式的存储(在线/离线)进行状态管理。
就对象的实际工作方式而言,这并不完全是JS(在所有情况下)。
长话短说,JavaScript是语言,然后是DOM / BOM。
文档 - 对象模型和浏览器 - 对象模型 DOM是一组函数/对象,可以让您与页面的HTML / CSS(应用于元素)进行交互。
BOM包含与HTML无关的内容,但与Web功能的其他部分相关。
console.log( );
就是一个很好的例子
JS没有本机console
对象或Console
构造函数。这是浏览器供应商(或第三方插件)添加到浏览器环境中的BOM的一部分,并且是一个特定的实现,没有真正的标准。
URL也是如此
JS有一个全局对象(在BOM中,它被称为window
),但它本身没有location
。
所以实施 - “如何”,很难回答 有些浏览器可能会在合法的JS中执行此操作,而其他浏览器则在C ++或C中执行此操作,而旧的IE甚至可以使用ActiveX组件。
也就是说,新的JS引擎确实具有魔术get
/ set
方法,可以在设置数据时执行操作。
最前沿的JS甚至有类似的Proxies,但是类固醇(几年内这些都不会被广泛支持)......
但是较旧的JS引擎在本地语言中没有这些功能,因此他们开始使用其他语言并将其连接起来以JS本身不支持的方式运行,但需要填写BOM / DOM。
这些天,使用.set
可能只需要获取构造函数的实例。
因此,在设置具有类似功能的自己的对象方面,您可以通过RegEx解析(或迭代部分)递给您的值。
在您的对象上,您可以将灵活的get
/ set
方法分配给属性名称,然后您可以在set
上修改当前实例的所有方面(基于value),或将新实例保存到旧的实例当前占用的var,并将新值传递给构造函数。
...但“在哪里位置”构造函数是一个不会以任何简单方式回答的问题,不需要浏览器浏览器,逐个版本。
答案 1 :(得分:0)
在浏览器中, window 实际上是全局对象的别名,因此self === window.self
和:
self.location
location
window.location
都是等价的。
location 对象记录在MDN: window.location和MSDN: The Window’s Location Object处。
用户可以通过在浏览器的地址栏中输入位置来设置位置。您也可以提供一个他们可以键入的输入元素,然后是一个将值赋给window.location
的按钮(或使用提供的参考中的任何方法)。
浏览器是否通过宏将字符串数据转换为位置对象,或者Javascript是否具有某种“隐式构造函数”机制,可以通过赋值来自动调用类的构造函数?
窗口和位置对象是不需要任何构造函数的宿主对象,它们只是“是”。即使它们是作为具有原型继承的实例实现的,也没有规范要求用户有权访问构造函数。
可以使用以下方法创建新窗口:
var newWindow = window.open(...);
我认为就像调用构造函数一样。
当为 location 对象分配了一个新URL时,它的行为符合所引用的文档。这是如何发生的,是一个未指定的实现细节,因此您可以按照自己喜欢的方式实现它,只要它的行为应该如此。这是javascript背后的一般哲学。
答案 2 :(得分:0)
你在这里寻找的是一个吸气/安装者对。
var window = {
get location() {
return {
get href() { return "foo"; },
set href() { /* change stored location data */; },
get port() { return 80; },
set port() { /* change stored location data */; },
/* etc ... */
};
}
set location() {
// change stored location data
}
};