javascript - 是否可以确定使用 Object.create 创建的对象是否继承自 JavaScript 中的 Array?

标签 javascript ecmascript-5 prototypal-inheritance

识别哪些对象是哪些 is complicated在 JavaScript 中,找出哪些对象是数组有一些 hacky solution .幸运的是,它在以下两种情况下都能正常工作:

Object.prototype.toString.call([]);           // [object Array]
Object.prototype.toString.call(new Array());  // [object Array]

很好,看不到 [object Object]!可悲的是,这种方法仍然失败了:

var arr = Object.create(Array.prototype);
Object.prototype.toString.call(arr);          // [object Object]

至少可以这么说,这令人沮丧。我的 arr 对象具有数组的所有方法,它的功能类似于数组,就所有用途而言,它一个数组。然而 JavaScript 不提供识别它的工具。

有什么方法可以判断一个对象是否继承自一个特定的原型(prototype)?我想您可以像这样遍历原型(prototype):

function inherits(obj, proto) {
    while (obj != null) {
        if (obj == proto) return true;
        obj = Object.getPrototypeOf(obj);
    }
    return false;
}

inherits(Object.create(Array.prototype), Array.prototype);  // true

但感觉有点老套。有没有更清洁的方法?

最佳答案

instanceof 怎么样?运算符(operator)?它为您的所有情况返回 true:

[] instanceof Array //true
new Array() instanceof Array //true
Object.create(Array.prototype) instanceof Array //true

但是:

Object.create(Array.prototype) instanceof Object //also true

所以要小心。

关于javascript - 是否可以确定使用 Object.create 创建的对象是否继承自 JavaScript 中的 Array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16728438/

相关文章:

Javascript 无限嵌套数组处理

javascript - 在 YAML 中使用 HTML 会生成 js-yaml 中的 [Object Object]

javascript - 当解析树只有一条语句时如何评估产生式 `SourceElements : SourceElements SourceElement`

javascript - ng-repeat 内的指令双向数据绑定(bind)不起作用

javascript - 关于原型(prototype)对象及其在 Javascript 继承中的作用

php - 相当于 php unpack() 函数的 javascript

javascript - 如何将 Vue.js 与 Requirejs 一起使用?

javascript - React - 基于浏览器的差异加载(es5、es6、esnext 等)

javascript - JS Promises/A+ 的 'catch' 方法名称是否无效,因为它是 JS 关键字?

coffeescript - 如何定义多个 CoffeeScript 类的属性