1

我正在研究 JavaScript,但我遇到了一些验证:

我想检查作为参数给出的变量是否是对象实例的实例。为了更清楚,这里有一个例子:

var Example = function () {
    console.log ('Meta constructor');
    return function () {
        console.log ('Instance of the instance !');
    };
};

var inst = new Example();
assertTrue(inst instanceof Example.constructor); // ok

var subInst = new inst();
assertTrue(subInst instanceof Example.constructor); // FAIL
assertTrue(subinst instanceof inst.constructor); // FAIL

我如何检查这subInst是一个实例Example.{new}?还是inst.constructor

4

2 回答 2

1

首先,您不要检查.constructor,而是检查构造函数,即Example. 每当您测试.constructor属性时,这将是在实例上找到的属性(如果您将其设置在构造函数的原型上)。

所以

(new Example) instanceof Example; // true

其次,如果你的Example函数返回一个函数,那么Example它实际上不是构造函数,因此你不能对它进行任何类型的原型继承检查。构造函数将始终返回一个对象,该对象将是构造函数的一个实例。

相反,您拥有的是一个工厂函数,它创建可用作构造函数的函数。函数只会通过和的instanceof检查。FunctionObject

var Ctor = example(); // PascalCase constructor, camelCase factory
var inst = new Ctor();
inst instanceof Ctor; // true

但是请查看@franky 发布的链接,它应该让您对需要做什么有所了解。

于 2012-10-22T07:52:21.727 回答
1
subInst.__proto__ == inst.prototype
于 2012-10-22T07:55:41.740 回答