【问题标题】:How to force javascript Array to inherit from my custom object?如何强制 javascript 数组从我的自定义对象继承?
【发布时间】:2014-09-26 19:41:19
【问题描述】:

是否可以做这样的事情 - 强制标准 javascript 对象从自定义对象继承? (没有实际用途,只是反问)。

var MyObject=function(){
        this.name="name from MyObject";
      }

Array.prototype=new MyObject();
var array = new Array();
console.log(array.name); //undefined

【问题讨论】:

  • 你不能。为什么不直接向Array.prototype 添加属性?效果基本一样。
  • @squint:在 JavaScript 中扩展内置对象通常被认为是个坏主意,不是吗?当然,这个想法要差几个数量级。
  • 你可以看看spec 发现Array.prototype 是不可写的。所以,理论上是可以的,但是要先检查属性的配置。
  • Felix Kling:虽然这在 ECMAScript 5 中是正确的,但在 ECMAScript 3 中却不一定正确,它(遗憾地)仍然安装在大量机器上。
  • @MikeHofer:不,最佳实践是定义一个整体策略,将其作为一个整体合理地协同工作。这可能涉及扩展本机原型,也可能不涉及。一种不好的做法是,将各种策略结合使用会产生错误。

标签: javascript inheritance


【解决方案1】:

当然,您可以重新分配 Array 的原型。但这样做可能会产生可怕的后果。

ECMAScript(JavaScript 所基于)对数组做出了某些基本假设。我想 ECMAScript 的某些实现会禁止重新分配内部类的原型,而其他实现会允许它(因为 JavaScript 的一个同样基本的规则是可以随时随地更改任何内容)。

但是,这样做会使 Array 完全不可预测且不可靠。

【讨论】:

  • 我问不是因为我想更改数组,我正在再次阅读 abt 继承,这只是一个修辞问题。我假设 javascript 中的任何对象都可以更改父对象,对吗?
  • 在早期版本的 ECMAScript 中,是的。从 ES 5 开始,这不再适用。
【解决方案2】:

发生这种情况是因为该属性的修改被禁用(我认为这是 ECMAScript 5 规范对原生对象的要求,但找不到任何证据来证明这一点)。在运行此查询的 chrome 中:

     Object.getOwnPropertyDescriptor(Array, 'prototype')

显示属性的描述符

     Object {
       value: Array[0], 
       writable: false, 
       enumerable: false,
       configurable: false
     }

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多