js自定义对象的实例

时间:2015-08-03 15:17:05

标签: javascript instanceof custom-object

我在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,我还需要更多关于新功能的解释。

4 个答案:

答案 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时发生的实际步骤。以下是步骤

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

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

  3. 如果函数返回非null对象,则new ...表达式求值为该值。否则,它将评估步骤1中创建的对象。

  4. 对于这个问题,最后一步的非空返回值(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