我正在尝试创建一个自定义对象,它具有浏览器“窗口”对象的所有属性和功能。任何模仿窗口对象函数的函数都应该只引用原始窗口对象,并在原始上下文中执行。
因此,新对象中任何方法都应该只指向具有原始上下文的现有窗口对象函数
NEWOBJECT.FUNCTON_NAME -> WINDOW.FUNCTION_NAME
我该怎么做呢?
有没有可能这样做?
我试着这样做:
function OurWindow() {
}
var obj = window;
do Object.getOwnPropertyNames(obj).forEach(function(key) {
var ptype = Object.prototype.toString.call(window[key]).slice(8, -1);
// if function
if (ptype == 'Function') {
OurWindow.prototype[key] = window[key].bind(window);
}
});
while(obj = Object.getPrototypeOf(obj));
但是我遇到了像" object“这样的函数/属性的问题,这些函数属于函数类型,并且有自己的子函数,它们不会在新的重复对象中被引用。
例如
OurWindow.Object.getOwnPropertyNames is undefined
发布于 2014-06-02 23:53:22
我猜您希望所有的全局方法都通过这个设置调用到全局对象中。因此,您可能会做如下操作(请注意,这需要ES5方法,如果功能测试显示它们不可用,则这些方法必须是多填充的):
(function(globalObject) {
var globalProps = Object.getOwnPropertyNames(globalObject);
globalProps.forEach(function(v) {
if (typeof globalObject[v] == 'function') {
globalObject[v] = globalObject[v].bind(globalObject);
}
});
}(this));
但是你为什么要这样做呢?也许您正在使用严格模式,并且不希望在未提供基引用的情况下调用全局方法时未定义此模式?但在我看来,这似乎只对本机方法有意义,而不是内置方法。
https://stackoverflow.com/questions/24004526
复制相似问题