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

我的问题是:
为什么Class1的返回值使list1成为Array的一个实例但忽略了Class2的返回值?
正确的方法是什么,以便对象进行instanceof Class
测试并通过Array.isArray(obj)
测试?
感谢您的帮助。这个Javascript继承让我疯狂。
答案 0 :(得分:0)
关于:
来自构造函数的'two'会被忽略吗?
请注意,当Array constructor is called with exactly one argument时,它被视为设置长度。所以:
var list2 = new Class2('two');
调用(有效):
Array('two');
创建一个新数组。如果单个参数不是数字,则忽略它并创建一个空数组(参见算法的第7步)。这是推荐使用Array文字或数组初始值设定项而不是构造函数的一个原因。
此外, instanceOf 不可靠。它只是检查一个对象是否在[[Prototype]]
链上的某个地方有构造函数的原型。