Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以确定使用object.create创建的对象是否继承JavaScript中的数组?_Javascript_Ecmascript 5_Prototypal Inheritance - Fatal编程技术网

是否可以确定使用object.create创建的对象是否继承JavaScript中的数组?

是否可以确定使用object.create创建的对象是否继承JavaScript中的数组?,javascript,ecmascript-5,prototypal-inheritance,Javascript,Ecmascript 5,Prototypal Inheritance,识别哪些对象是JavaScript中的哪些对象,并找出哪些对象是数组,这些都有一定的重要性。幸运的是,它在以下两种情况下都能正常工作: Object.prototype.toString.call([]); // [object Array] Object.prototype.toString.call(new Array()); // [object Array] 太好了,看不到[object object]!遗憾的是,这种方法仍然失败: var arr = Objec

识别哪些对象是JavaScript中的哪些对象,并找出哪些对象是数组,这些都有一定的重要性。幸运的是,它在以下两种情况下都能正常工作:

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并没有提供识别它的工具

有没有办法确定一个对象是否继承自某个特定的原型?我想你可以像这样迭代原型:

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
但感觉有点不舒服。有更干净的方法吗?

接线员怎么样?对于您的所有情况,它将返回
true

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

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

所以要小心。

ECMAScript 5在javascript中引入了
Array.isArray()
,它提供了一种可靠的检查方法。对于较旧的浏览器,我们通过以下方式修复(引用自本文)

但是我刚刚发现内置函数
Array.isArray
在使用
Object.create
(在chrome中测试)时无法正常工作。我想出了一个有效的方法:

function isArray(value) {
     if (typeof value === "undefined" || value === null) {
          return false;
     }
     do {
          if (Object.prototype.toString.call(value) === "[object Array]") {
               return true;
          }
          value= Object.getPrototypeOf(value);
     } while (value);

     return false;
}
使用它:

var arr = Object.create(Array.prototype);
var arr1 = Object.create(Object.create(Array.prototype));
var arr2 = new Array();
var arr3 = [];
isArray(arr); 
isArray(arr1); 
isArray(arr2); 
isArray(arr3); 

检查构造函数怎么样

function inherits(obj, proto) {
    return obj.constructor === proto.constructor;
}

inherits(Object.create(Array.prototype), Array.prototype);  // true
有关从数组继承的问题的详细说明,请参见

无论如何,在最简单的情况下,你在做什么

var sort_of_an_array = Object.create(Array.prototype);
您可以使用
isPrototypeOf
进行检查:

Array.prototype.isPrototypeOf(sort_of_an_array)

它的功能类似于一个数组,在所有用途中,它都是一个数组

否。它没有自动更新
length
属性。看看为什么很难将
数组子类化

有没有办法确定一个对象是否继承自某个特定的原型?我想你可以反复浏览原型,但感觉有点粗糙

这就是怎么做的。比自编函数更简洁的方法是使用:


instanceof Array没有提供一种可靠的方法来检查我们在帧之间来回传递数组的时间,因为每个帧都有自己的数组构造。对于单帧环境或节点,这是一种合理的解决方案。请记住多帧问题。我只是好奇:为什么要创建这样的数组<代码>对象.create(Array.prototyp)并通过
Object.prototype.toString.call(arr)进行检查
@Zim84:我想这只是一个例子。在实际应用中,我们永远不应该这样做。在实际应用程序中,Object.create(Array.prototype)可能会在其他地方调用,并将创建的对象传递给另一个函数。问题是您实际上没有真正的数组(例如,它没有神奇的
length
属性,只是一个乍一看很像的属性)。你拥有的是一个数组,恰巧它拥有一个真正数组的所有方法。如果您想检查数组类型,基本上只需查看它是否具有
length
属性,而不是字符串。这是最好的方法。如果你想检查真实数组,请继续使用
Object.prototype.toString.call
Array.isArray
并知道原型为
Array.prototype
的对象不一定是真实数组。
Array.isArray
Object.prototype.toString.call(arr)='[对象数组]”
。如果对象的原型是一个具有数组原型的对象,则此解决方案将不起作用。
var arr=object.create(object.create(Array.prototype));
@NathanWall:看看这看起来更好。只需一点挑剔:它不会测试某个对象是否是真正的数组(如我对原始问题的评论中所述)。这实际上是测试某个东西是构造为数组还是继承了构造为数组的东西(这是不同的)。所以可能是“isArray”不是函数的最佳名称。但是,此解决方案满足了原始问题,并且可能是询问者能够满足其条件的最佳解决方案。他只需要了解实际情况。@NathanWall:更新以测试当前对象。感谢您指出。您所做的基本上是实现
isPrototypeOf
你自己。
isPrototypeOf
为你走这条链条,就像你手动做的那样。
Array.prototype.isPrototypeOf(sort_of_an_array)
arr instanceof Array; // true