我正在尝试子类化本机窗口对象,但是当我这样做时,没有一个窗口方法可以在子类中调用。
以下是一个例子:
<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>
有人可以解释为什么不起作用以及是否有解决方法?
由于
答案 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的一个实例,它们不一样。