无法在javascript中调用本机窗口对象的子类上的方法

时间:2014-03-17 14:38:56

标签: javascript subclass native

我正在尝试子类化本机窗口对象,但是当我这样做时,没有一个窗口方法可以在子类中调用。

以下是一个例子:

<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>

有人可以解释为什么不起作用以及是否有解决方法?

由于

2 个答案:

答案 0 :(得分:2)

正如您已经想到的那样,窗口的某些属性是正确继承的,而其他属性则没有。那些不是那些期望它们被调用的对象是窗口的方法,在你的例子中显然不是这种情况。通过&#34;期待&#34;我的意思是如果没有达到预期,他们会抛出错误。

你可以做些什么来避免它,可能会覆盖那些特定的功能,也许是以某种方式使用原始功能(取决于你想用它们做什么)。

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);

答案 1 :(得分:0)

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的一个实例,它们不一样。