【问题标题】:js instance of custom object自定义对象的js实例
【发布时间】:2015-08-03 15:17:05
【问题描述】:

我在 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 ?

感谢您的帮助

编辑:即使我的问题看起来像这样:What's wrong with a JavaScript class whose constructor returns a function or an object,我的问题也需要更多关于新问题的解释。

【问题讨论】:

标签: javascript instanceof custom-object


【解决方案1】:

您可以根据 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. 如果函数返回一个非空对象,new ... 表达式的计算结果为该值。否则,它将评估为在步骤 1 中创建的对象。


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

【讨论】:

  • 它有效,但我不完全理解为什么......我会深入研究它,明天我会检查我是否可以使用它,但我认为它会很好。谢谢!!
  • 这是我需要的,谢谢!我现在完全理解你的回答了,再次感谢=)
【解决方案2】:

如果你至少可以修改 prop,那么你可以给它添加一个标志:

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

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

function isMyObject(obj) {
    return obj._isMyObject ? true : false;
}

【讨论】:

  • 是的,这正是我一开始想做的,但我想在不添加其他属性的情况下尝试其他方法,但是谢谢。
【解决方案3】:

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

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;

【讨论】:

  • 这就是它的工作方式。您至少可以将该返回语句包装在例如getter 函数中吗?
【解决方案4】:

这是因为当你这样做时

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

【讨论】:

  • 构造函数函数。
  • 这甚至行不通。 + 两种方式都可以声明一个函数。
  • 已编辑以反映正确的措辞。原来的方式定义一个函数,我的方式定义一个类。
  • 它不返回 true,在 f12 中测试。而且,我可能错了,我认为声明函数的两种方式之间的主要区别在于它是否被分配。按照我的方式,MyObject 不会被吊起。
  • 嗯,感谢 Barudar 的反馈。我实际上在发布之前对其进行了测试,但我想我在测试中做了一些不同的事情。
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 2019-12-28
  • 2016-06-05
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
相关资源
最近更新 更多