Javascript继承和数组(需要示例)

时间:2015-10-22 21:34:52

标签: javascript arrays oop inheritance javascript-objects

我试图扩展数组对象,但是我对它的继承部分感到困惑。让我用一个例子来证明:



    function Class1() {
      return Array.apply(null, arguments);
    };

    function Class2() {
      Array.apply(null, arguments);
      return 'ignored?';
    };

    Class1.prototype = Object.create(Array.prototype);
    Class2.prototype = Object.create(Array.prototype);

    var list1 = new Class1('one');

    list1.push(1);

    console.log("list1: ", list1);
     //prints ["one", 1]

    console.log(Array.isArray(list1), list1 instanceof Class1);
     //prints isArray: true, instanceof Class1: false

    var list2 = new Class2('two');
    list2.push(2);

    console.log("list2: ", list2);
     //prints [2] only.. 'two' from constructor is ignored?

    console.log(Array.isArray(list2), list2 instanceof Class2);
     //prints isArray:false,  instanceof Class2: true
     //return value in function Class2 has no effect




我的问题是:

  1. 为什么Class1的返回值使list1成为Array的一个实例但忽略了Class2的返回值?

  2. 正确的方法是什么,以便对象进行instanceof Class测试并通过Array.isArray(obj)测试?

  3. 感谢您的帮助。这个Javascript继承让我疯狂。

1 个答案:

答案 0 :(得分:0)

关于:

  

来自构造函数的'two'会被忽略吗?

请注意,当Array constructor is called with exactly one argument时,它被视为设置长度。所以:

var list2 = new Class2('two');

调用(有效):

Array('two');

创建一个新数组。如果单个参数不是数字,则忽略它并创建一个空数组(参见算法的第7步)。这是推荐使用Array文字或数组初始值设定项而不是构造函数的一个原因。

此外, instanceOf 不可靠。它只是检查一个对象是否在[[Prototype]]链上的某个地方有构造函数的原型。