在这些条件下,如何确定 new Object
和 new 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 中无法做到这一点,原因如下:
查看x
和y
创建。
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.prototype
和 y
的引用 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/