如何在Javascript中绑定隐藏的原型

Sly*_*erZ 2 javascript

我正试图在一个隐藏它的环境中访问Float32Array,更准确地说,就是可汗学院的编程环境.

我看到一个人做hacky做类似的事情,我调整了他的代码,但我真的不明白为什么我通过这样编写代码来访问Float32Array.

码:

var Float32Array = (function () {
    return this.Function("return Float32Array;");
})()();

var a = new Float32Array([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)

Firefox警告:

不建议使用不带new的内置类型数组构造函数,并且在ES6中将被禁止

Chrome错误

构造函数Float32Array需要'new'

这告诉我,我在这里做错了,但我不知道它是什么.我怎样才能以更强大的方式访问Float32Arrays?

T.J*_*der 5

这告诉我,我在这里做错了,但我不知道它是什么.

不,它只是告诉你,无论什么工具告诉你,你不理解你的代码.

你不打电话 Float32Arraynew,你只是提到它.

代码

this.Function("return Float32Array;");
Run Code Online (Sandbox Code Playgroud)

...调用它在你的例子中调用的方式(松散模式)正在创建一个函数体return Float32Array;,如下所示:

function anon() {
    return Float32Array;
}
Run Code Online (Sandbox Code Playgroud)

......但它是在全球范围内评估的,而不是在本地范围内评估的.

你的包装:

var Float32Array = (function() {
})()();
Run Code Online (Sandbox Code Playgroud)

...是一个返回给定函数然后立即调用它的函数.因此,您的Float32Array变量最终会成为Float32Array全局范围内的任何变量(绕过阴影).


也就是说,请注意这段代码很容易被愚弄.也许它在Khan acadamy上下文中起作用,但只是通过分配Float32Array全局对象的属性或在全局范围内重新声明它很容易被愚弄.

也就是说,它适用于:

(function() {
  // Khan academy code
  function Float32Array() {
    console.log("Mine");
  }

  // Your code
  var y = (function() {
    return this.Function("return Float32Array;");
  })()();
  var foo = new y(10);
  console.log("Done", foo);
})();
Run Code Online (Sandbox Code Playgroud)

但会在这里失败:

(function() {
  window.Float32Array = function() {
    console.log("Mine");
  };
  var y = (function() {
    return this.Function("return Float32Array;");
  })()();
  var foo = new y(10);
  console.log("Done", foo);
})()
Run Code Online (Sandbox Code Playgroud)

或者在这里

function Float32Array() {
  console.log("Mine");
}
var y = (function() {
  return this.Function("return Float32Array;");
})()();
var foo = new y(10);
console.log("Done", foo);
Run Code Online (Sandbox Code Playgroud)

...因为全局符号被覆盖.