我正在尝试创建一个自定义对象,它具有浏览器" window"的所有属性和功能。宾语。 任何模仿窗口对象函数的函数都应该只引用原始窗口对象并使用原始上下文执行。
因此,新对象中的任何方法都应该指向具有原始上下文的现有窗口对象函数
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
答案 0 :(得分:0)
我想你希望通过将 this 设置为全局对象来调用所有全局方法。所以你可能会做类似下面的事情(注意这需要ES5方法,如果功能测试显示它们不可用,必须进行多层填充):
(function(globalObject) {
var globalProps = Object.getOwnPropertyNames(globalObject);
globalProps.forEach(function(v) {
if (typeof globalObject[v] == 'function') {
globalObject[v] = globalObject[v].bind(globalObject);
}
});
}(this));
但你为什么要那样做呢?也许您正在使用严格模式,并且在调用全局方法时不希望此未定义而不提供基本引用?但在我看来,只对本地方法有意义,而不是内置方法。