Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何引用窗口函数和属性_Javascript - Fatal编程技术网

Javascript 如何引用窗口函数和属性

Javascript 如何引用窗口函数和属性,javascript,Javascript,我正在尝试创建一个自定义对象,它具有浏览器“窗口”对象的所有属性和功能。 任何模仿窗口对象函数的函数都应该只引用原始窗口对象,并使用原始上下文执行 因此,新对象中的任何方法都应该只指向具有原始上下文的现有窗口对象函数 NEWOBJECT.FUNCTON_NAME -> WINDOW.FUNCTION_NAME 我该怎么做 甚至可以这样做吗 我试着这样做: function OurWindow() { } var obj = window; do Object.getOwnPr

我正在尝试创建一个自定义对象,它具有浏览器“窗口”对象的所有属性和功能。 任何模仿窗口对象函数的函数都应该只引用原始窗口对象,并使用原始上下文执行

因此,新对象中的任何方法都应该只指向具有原始上下文的现有窗口对象函数

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

我猜您希望所有的全局方法都通过这个集合调用到全局对象。因此,您可以执行以下操作(注意,这需要ES5方法,如果功能测试显示这些方法不可用,则这些方法必须是多填充的):


但你为什么要这么做?也许您正在使用strict模式,不希望在调用全局方法而不提供基引用时未定义该模式?但在我看来,这只适用于本机方法,而不是内置方法。

“…并使用原始上下文执行”。不可能,你不能伪造一个。代码要么在特定的上下文(全局、函数、eval)中运行,要么不是。它可能是.bind(window),顺便说一句。为什么要这样做?我正在尝试为不同的javascript模块隔离全局上下文,以便它们可以共存而不发生冲突。这是我正在编写的一个更大框架的一部分,这就是我这样做的原因。
(function(globalObject) {
  var globalProps = Object.getOwnPropertyNames(globalObject);
  globalProps.forEach(function(v) {

    if (typeof globalObject[v] == 'function') {
      globalObject[v] = globalObject[v].bind(globalObject);
    }
  });
}(this));