1

我在 JavaScript 中使用 instanceof 时遇到了问题:

var MyObject = function() {
    var prop = {}; 
    return prop;
}

var testObject = new MyObject();
console.log(testObject instanceof MyObject); // return false;

Instanceof 返回 Object 而不是预期的 MyObject。我无法删除“return prop”;如何获得 testObject 的类型 MyObject ?

感谢您的帮助

编辑:即使我的问题看起来像这样:构造函数返回 function 或 object 的 JavaScript 类有什么问题,我需要更多解释 new 的作用。

4

4 回答 4

2

您可以根据new操作员的工作将其分解为多个步骤

var MyObject = function () {
    var prop = {};
    return prop;
}

var testObject = Object.create(MyObject.prototype);
var result = MyObject.call(testObject);
// result is the actual output of new MyObject();
result = result && typeof result === 'object' ? result : testObject;

console.log(testObject instanceof MyObject); // returns true
console.log(result instanceof MyObject); // returns false because it's actually prop (i.e. {})

我们所做的是将 替换为new您执行new. 以下是步骤

  1. 创建一个其原型与函数(构造函数)原型相同的对象。这是什么var testObject = Object.create(MyObject.prototype);

  2. 调用(构造函数)函数并this设置为这个新创建的对象。这是做什么var result = MyObject.call(testObject);的(第一个参数是thisMyObject 调用的值)

  3. 如果函数返回一个非空对象,则new ...表达式计算为该值。否则,它评估为在步骤 1 中创建的对象。


对于这个问题,最后一步的非空返回值(prop = {})妨碍了我们实际测试步骤 1 中返回的对象的类型。通过将其拆分为组件步骤,我们可以获得创建的对象(和在 instanceOf 测试中使用它)

于 2015-08-03T15:53:07.893 回答
1

如果您至少可以修改 prop,那么您可以为其添加一个标志:

var MyObject = function() {
    var prop = { _isMyObject: true }
    return prop;
};

然后你可以有一个检查那个标志的函数。

function isMyObject(obj) {
    return obj._isMyObject ? true : false;
}
于 2015-08-03T15:32:56.220 回答
0

如果你试试这个,你会明白为什么:

var MyObject = function() {
    var prop = { testProp: 1 }; 
    return prop;
}

var testObject = new MyObject();
console.log(testObject.testProp); // returns 1;

如果在类构造函数中返回一个对象,则该对象的新实例化对象将成为该返回的对象。如果您返回一个原始值,它将成为您最初预期的对象的实例。

因此,如果您在prop对象上应用 Object.prototype.toString() 方法并返回该结果(字符串原语),您将获得所需的 MyObject :

var MyObject = function() {
    var prop = {}; 
    return prop.toString();
}

var testObject = new MyObject();
console.log(testObject instanceof MyObject); // returns true;
于 2015-08-03T15:28:06.860 回答
-3

这是因为当你这样做

var MyObject = function() {
    var prop = {}; 
    return prop;
}

您正在为变量 MyObject 分配一个函数。不创建自定义对象 MyObject。为了创建自定义对象,您需要使用语法

function MyObject() {
    var prop = {}; 
    return prop;
}

var testObject = new MyObject();
console.log(testObject instanceof MyObject); // return true;

参考:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

于 2015-08-03T15:24:07.560 回答