【问题标题】:Why are instances created from inherited functions different from instances created by parent functions?为什么继承函数创建的实例与父函数创建的实例不同?
【发布时间】:2019-08-27 08:40:40
【问题描述】:

为什么从“下游”函数创建的对象与从“上游”函数创建的对象不同?

如果你创建一个继承自 Javascript 的 Array 构造函数的构造函数,那么你会期望从你的构造函数和 Array 构造函数创建的对象是相同的。

为什么在这种情况下对象不一样?

我尝试将 NewArray.prototype.constructor 设置为 Array 但它仍然给了我相同的结果。

function NewArray() {};
NewArray.prototype = Object.create(Object.getPrototypeOf([]));
NewArray.prototype.constructor = NewArray;
NewArray.prototype.first = function() {
         return this[0];
}
let newArr = new NewArray();
let oldArr = new Array();

newArr.push(5) // {'0': 5, length: 1}; shouldn't it output [5] ???
oldArr.push(5) // [5]

【问题讨论】:

  • push 函数的返回值是新元素被推送后数组的新长度......如果你没有改变这种行为,为什么你会期待别的东西?
  • “它不应该输出 [5] 吗?” – 那么……应该 what 输出 [5] 吗?如果您谈论的是浏览器的控制台,它将以各种方便的方式可视化值。没有关于应该如何出现在控制台中的规范。它可能有一个专门针对Array 实例的特殊规则,但其他自定义对象作为对象输出。

标签: javascript oop prototype


【解决方案1】:

这可能会做你想要的。

function NewArray(){
  Array.call(this);
}

NewArray.prototype = Object.create(Array.prototype);

let z = new NewArray();
z.push(5) // [5]

我知道的解释有点长,我没有时间输入它,但使用Udacity's Object-Oriented JavaScript 可以帮助消除混乱(这是一门免费课程)。

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 2018-01-21
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2016-03-02
    相关资源
    最近更新 更多