使用window作为原型在javascript中返回看似错误的值
您希望这段代码返回“123”,但它返回的是窗口对象使用window作为原型在javascript中返回看似错误的值,javascript,Javascript,您希望这段代码返回“123”,但它返回的是窗口对象 function W() { this.window = "123"; } W.prototype = window; (new W()).window; // window object, not "123" 请检查后续问题()全局窗口对象上的窗口属性引用自身,并且它是不可变的 因此,构造函数W无法将属性设置为123 window.window; // returns window object window.window =
function W() {
this.window = "123";
}
W.prototype = window;
(new W()).window; // window object, not "123"
请检查后续问题()全局
窗口
对象上的窗口
属性引用自身,并且它是不可变的
因此,构造函数W
无法将属性设置为123
window.window; // returns window object
window.window = "123";
window.window; // still returns window object
如果您尝试在W
构造函数中设置一个非不可变属性,您将看到它工作正常
function W() {
this.notWindow = "123";
}
W.prototype = window;
(new W()).notWindow; // returns "123"
这与原型无关,而是与尝试设置不可变属性有关。不过,这个问题很有趣 另一个答案并不完全正确。代码的问题在于窗口界面是(注意大写字母W)<代码>窗口。窗口指的是允许代码正常工作的
窗口
对象
function W() {
this.window = "123";
}
W.prototype = Window;
(new W()).window; // 123
这不是关于
窗口
属性,而是关于不变性
将值指定给不可变属性时,将忽略这些值。此示例将使用另一个不可变属性重新引入问题
函数W(){
this.immutableProperty=0;
}
W.prototype=Object.create({}{
不可变属性:{
价值:1
}
});
警报(新W().immutableProperty)//1
正如前面所指出的窗口。窗口
是不可变的,但您可以在W()
构造函数中定义自己的窗口
属性
函数W(){
Object.defineProperty(此“窗口”{
对,,
可枚举:正确,
可写:对,
值:“123”
});
}
W.原型=窗口;
document.write(新的W()窗口)//123
您为什么要这样做?-而且,window.window
是window
,据我所知,它是不可变的。确切地说。。。即使要创建一个对象,它的原型是窗口。但是,当使用new
调用函数时,为什么this
是窗口对象?@nnnnnn:因为原型是window
。如果您查看Chrome并检查new W()
,您将看到notWindow
是W
的一个属性,其中所有其他属性都继承自其原型(window)。好的,是时候澄清了<代码>窗口指的是不可变的全局对象window
有一个名为window
的指针,它指向自身,允许您无限地调用window.window…
。OP代码中的错误是(new W())
,它是W
类型的对象,而不是Window
(Window
实现的接口)。如果他实例化了类型为Window
的对象,Window
属性不是不可变的。@nnnnnn不是此
指的是W
,而不是窗口
对象。由@James Monger给出的答案是100%正确,而您的答案是不正确的<代码>窗口不是您所想的,因此W实例不会从窗口继承任何东西,OP的意图。它必须是window
,而不是window
@dfsqW.prototype=window
是一个语法错误,W.prototype=Window代码>不可用。OP的问题被严重低估了。如果我从字面上理解他想要一个“123”的输出,这就回答了这个问题。“W.prototype=window;
是一个语法错误”。当然不是,只需打开控制台并进行测试。20秒足以确认@James Monger的答案是正确的,而您的答案是错误的。因此,据我所知,不变性也是继承的moo?请检查后续问题,但在我的示例中,W没有不可变的属性窗口。W的原型(窗口)确实如此。所以,属性的不变性似乎也是遗传的。