我在JavaScript中使用instanceof遇到了问题:
var MyObject = function() {
var prop = {};
return prop;
}
var testObject = new MyObject();
console.log(testObject instanceof MyObject); // return false;
Instanceof返回Object而不是预期的MyObject。我无法删除“返回道具”;如何获取testObject的MyObject类型?
感谢您的帮助
编辑:即使我的问题看起来像这样:What's wrong with a JavaScript class whose constructor returns a function or an object,我还需要更多关于新功能的解释。
答案 0 :(得分: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
时发生的实际步骤。以下是步骤
创建一个对象,其原型与函数原型相同(构造函数)原型。这就是var testObject = Object.create(MyObject.prototype);
调用(构造函数)函数,并将this
设置为此新创建的对象。这就是var result = MyObject.call(testObject);
所做的(第一个参数是MyObject调用的this
的值)
如果函数返回非null对象,则new ...
表达式求值为该值。否则,它将评估步骤1中创建的对象。
对于这个问题,最后一步的非空返回值(prop = {})妨碍了我们实际测试步骤1中返回的对象的类型。通过将其拆分为组件步骤,我们可以获取创建的对象(并在instanceOf测试中使用它)
答案 1 :(得分: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;
答案 2 :(得分:0)
如果您至少可以修改 prop
,那么您可以为其添加一个标记:
var MyObject = function() {
var prop = { _isMyObject: true }
return prop;
};
然后你可以有一个检查那个标志的函数。
function isMyObject(obj) {
return obj._isMyObject ? true : false;
}
答案 3 :(得分:-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