可以't在javascript中调用本地窗口对象的子类上的方法
Can't call methods on subclass of native window object in javascript
我正在尝试对本机窗口对象进行子类化,但当我这样做时,子类中没有任何窗口方法是可调用的。
下面是一个例子:
<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的一个实例,它们不相同。
相关文章:
- 调整窗口大小时,可拖动的对象会出现在容器外部
- 如何在选项卡上定义属性'的主窗口对象
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 可以从Chrome扩展修改窗口对象吗
- 在Backbone.js中为窗口对象指定变量
- 从html锚元素传递窗口对象
- 如何在ReactJS中使用窗口对象
- 在angularJS中使用模态窗口时,在控制器之间共享对象数组
- HackReactor,编码窗口现在可以访问一个名为“”的对象;招生;使用名为“;showApp”;.调用此方法时不带任
- 在加载时调用时,窗口对象的某些变量丢失
- 是否可以模拟 qUnit 测试的窗口位置对象
- 清除 Javascript 中窗口对象中的自定义变量
- 为什么当我尝试将函数绑定到自身时,“this”对象仍然引用窗口
- 窗口对象属性返回一个dom节点
- 使用窗口对象练习我的对象文字函数
- 如何从Chrome扩展访问所有窗口对象
- “this”返回的是[对象窗口],而不是元素
- 将变量打印到控制台时出现意外字符串:[对象窗口]
- 当我提醒“;这个“;鼠标悬停在<td>[对象窗口]弹出-那是什么
- javascript[对象窗口]在一个concat字符串