2009-07-25 48 views
2

如何确定在这些条件下new Objectnew fn之间的差异?确定新对象和新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"); 
+0

你的意思是你想知道FOO是SomeClass的实例,或者具有相同属性的只是一个对象? – 2009-07-25 17:20:05

+2

我不认为这是可能的。 – 2009-07-25 17:22:20

回答

3

我敢肯定你不能只用标准的支持为此在ES3,和这里的原因:

xy创作。

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

var x = new fn, 
    y = new Object; 

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

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

所以,现在你最终2名Object对象只不同之处在于它们的内部[[原型]]的引用不同的对象 - x的不管你分配给fn.prototypey的引用Object.prototype一个引用。它们的内部[[Class]]属性也是相同的。等于“对象”)

你不能去[[原型]在ES3的直接访问。您可以通过使用instanceof推断出一些事情,但由于fn是你的榜样归零intanceof基于推断出来的照片。现在

,你可以增加以这种方式,它会在一定程度变异实例化对象Object构造。然后,您可以检查一个对象并检测该增强。例如:

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

然后:

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

但是这当然会,正与new Object创建时的对象,而不是通过,也就是说,对象文本只工作 - { }。这也是相当突兀:)

也许还有其他的方式,但我不能看到他们现在。

HTH

3

据我知道你的问题是不可能的ES3解决:instanceofisPrototypeOf()不能用来解决这个问题,因为原型对象fn无法访问,只有ES5允许通过Object.getPrototypeOf()访问内部[[Prototype]]属性。

顺便说一句,如果分配到Object.prototypefn.prototype,如

var x = (function() { 
    function Foo() {} 
    Foo.prototype = Object.prototype; 
    return new Foo; 
})(); 

由于FooObject实例的原型链是相同的,不应该有任何的方式来区分,以解决一个更难的问题是他们。