可以't在javascript中调用本地窗口对象的子类上的方法

Can't call methods on subclass of native window object in javascript

本文关键字:对象 窗口 子类 方法 调用 javascript 可以      更新时间:2023-09-26

我正在尝试对本机窗口对象进行子类化,但当我这样做时,子类中没有任何窗口方法是可调用的。

下面是一个例子:

<script type="application/javascript" >

function baseWindow () {

}
baseWindow.prototype = window;
var mywindow  = new baseWindow();
window.alert('works'); // works of course
alert(window.document); // accessing property of course works
mywindow.alert('doesn''t work'); // alert doesn't work in subclass error: TypeError: Illegal invocation
mywindow.__proto__.alert('works') // accessing it directly via __proto__ works
alert(mywindow.document); // accessing document property works 
</script>

有人能解释为什么这不起作用吗?如果有变通办法的话?

感谢

正如您已经发现的,window的一些属性是正确继承的,而其他属性则不是。那些不是的方法期望调用它们的对象是window,而在您的示例中显然不是这样。我所说的"期望"是指如果没有达到期望,他们就会抛出错误。

为了避免它,你可以覆盖那些特定的函数,也许可以通过某种方式使用原始函数(取决于你想对它们做什么(。

function MyWindow(){
  this.alert = window.alert.bind(window); // override it to work!
}
MyWindow.prototype = window;
var mine = new MyWindow();
mine.alert(mine.location);

如果你想要Window的许多实例和它们之间共享的单个警报函数,并且你不想更改Window.alert,你需要添加另一个从Window继承的对象作为Window的原型:

function MyWindow() {
}
MyWindow.prototype = Object.create(window);
MyWindow.prototype.alert = window.alert.bind(window);
var mine = new MyWindow();
mine.alert(mine.location);
I am trying to subclass native window object,

你不能。

为什么?因为window不是函数,不能调用window构造函数。

为什么?因为DOM是这样构建的。

function baseWindow () {

}
baseWindow.prototype = window

这甚至不是典型的继承。

如果Window构造函数是可调用的,就可以编写

function BaseWindow () {
  Window.call(this);
}
BaseWindow.prototype = Object.create(Window.prototype)

但你不能那样做。

编辑只是为了清楚,

window是window的一个实例,它们不相同。