[英]Determining the difference between new Object and new fn
在这些条件下,如何确定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无法解决您的问题: instanceof
和isPrototypeOf()
无法解决,因为fn
的原型对象不可访问,并且只有ES5允许访问内部[[Prototype]]属性通过Object.getPrototypeOf()
。
顺便说一句,一个更难解决的问题是将Object.prototype
分配给fn.prototype
,例如
var x = (function() {
function Foo() {}
Foo.prototype = Object.prototype;
return new Foo;
})();
由于Foo
和Object
实例的原型链是相同的,因此不应有任何区分它们的方法。
我敢肯定,仅凭标准支持就无法在ES3中做到这一点,原因如下:
看一下x
和y
创建。
var fn = function(){};
fn.prototype = {};
var x = new fn,
y = new Object;
实例化x
,其内部[[Prototype]]被设置为fn.prototype
引用的对象(只是分配给fn.prototype
的Object
对象)。 然后,在该新创建的对象的上下文中调用对象的构造函数fn
,但是由于它不会以任何方式使ab对象突变,因此我们可以认为该步骤无关紧要。
实例化y
,其内部[[Prototype]]设置为Object.prototype
,这也是一个Object
对象。 然后,也在这个新创建的对象的上下文中调用其构造函数( Object
),但是在那里也没有任何反应。
因此,现在您得到2个Object
对象,它们的不同之处仅在于它们的内部[[Prototype]]引用不同的对象x
的对象引用了您分配给fn.prototype
, y
的对象引用了Object.prototype
。 它们的内部[[Class]]属性也相同(即等于“ Object”)
您无法直接访问ES3中的[[Prototype]]。 您可以使用instanceof
来推断有关它的信息,但是由于在您的示例中fn
为空, intanceof
基于intanceof
的推断是intanceof
的。
现在,您可以通过某种方式增强Object
构造函数,以某种方式使实例化的对象发生突变。 然后,您可以检查一个对象并检测此增强。 例如:
Object = function() {
return ({ __: void 0 });
}
接着:
function isNewObject(object) {
return '__' in object;
}
但这当然仅在使用new Object
创建对象时才起作用,而不是通过对象常量- { }
。 这也很让人讨厌:)
也许还有其他方法,但是我现在看不到它们。
HTH
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.