繁体   English   中英

确定新对象与新函数之间的区别

[英]Determining the difference between new Object and new fn

在这些条件下,如何确定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无法解决您的问题: instanceofisPrototypeOf()无法解决,因为fn的原型对象不可访问,并且只有ES5允许访问内部[[Prototype]]属性通过Object.getPrototypeOf()

顺便说一句,一个更难解决的问题是将Object.prototype分配给fn.prototype ,例如

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

由于FooObject实例的原型链是相同的,因此不应有任何区分它们的方法。

我敢肯定,仅凭标准支持就无法在ES3中做到这一点,原因如下:

看一下xy创建。

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

var x = new fn,
    y = new Object;

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

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

因此,现在您得到2个Object对象,它们的不同之处仅在于它们的内部[[Prototype]]引用不同的对象x的对象引用了您分配给fn.prototypey的对象引用了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM