javascript - 确定 new Object 和 new fn 之间的区别

标签 javascript prototype

在这些条件下,如何确定 new Objectnew fn 之间的差异?

  • var fn = function(){};
  • fn.prototype = {};
  • 您不能依赖现有的 __proto__Object.getPrototypeOf,因为它们不在 IE 或 Opera 中。
  • 该解决方案可能不会静态使用 fn,例如 instanceof fn
  • 实现您自己的 Object.getPrototypeOf 就可以了。

不需要:如果您的解决方案能够与其他框架中的对象一起使用并且不使用函数序列化,那就太好了。

以下是一些示例基本代码:

var fn = function(){};
fn.prototype = {};

var x = new fn,
y = new Object;

fn = null; // prohibit static reference to fn

// define your detection function here
function isNewObject(obj) {

};

alert(isNewObject(x) !== isNewObject(y) ? "pass" : "fail");

最佳答案

我很确定在仅标准支持的 ES3 中无法做到这一点,原因如下:

查看xy 创建。

var fn = function(){};
fn.prototype = {};

var x = new fn,
    y = new Object;

x实例化时,其内部[[Prototype]]被设置为fn.prototype引用的对象(只是一个Object 您分配给 fn.prototype 的对象)。然后,对象的构造函数 - fn - 在新创建的对象的上下文中被调用,但由于它不会以任何方式改变 ab 对象,因此我们可以认为该步骤无关紧要。

y 实例化时,其内部 [[Prototype]] 被设置为 Object.prototype,它也是一个 Object 对象。然后,它的构造函数 (Object) 也在这个新创建的对象的上下文中被调用,但那里也没有发生任何事情。

所以现在你最终得到了 2 个 Object 对象,它们的唯一区别在于它们的内部 [[Prototype]] 引用了不同的对象 - x 的一个引用了任何对象您分配给 fn.prototypey 的引用 Object.prototype。它们的内部 [[Class]] 属性也相同(即等于“Object”)

您无法直接访问 ES3 中的 [[Prototype]]。您可以使用 instanceof 来推断一些信息,但由于 fn 在您的示例中为空,因此基于 instanceof 的推断无法实现。

现在,您可以以某种方式增强 Object 构造函数,使其以某种方式改变实例化的对象。然后,您可以检查对象并检测这种增强。例如:

Object = function() {
  return ({ __: void 0 });
}

然后:

function isNewObject(object) {
  return '__' in object;
}

但是,当然,这仅在使用 new Object 创建对象时有效,而不是通过对象文字 - { } 创建。这也相当唐突:)

也许还有其他方法,但我现在看不到。

HTH

关于javascript - 确定 new Object 和 new fn 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1182531/

相关文章:

javascript - 获取导入的 HTML 的主机名

javascript - ajax 中的警报甲酸盐没有得到响应

javascript - java中ajax post调用的等效方法

javascript - 原型(prototype)声明的函数不是函数

javascript - 带有可编辑复选框列的 jqGrid

javascript - 7 位和 16 位的 jquery SMS 字符计算器

javascript - 使用 String.prototype 扩展 String 时无法覆盖 javascript 中的 "this"

Javascript - 新方法

symfony - 集合字段类型不创建表单元素

javascript - ES6 箭头函数在原型(prototype)上不起作用?