【问题标题】:Javascript - Getting 'undefined' when trying to get array's prototypeJavascript - 尝试获取数组的原型时获取“未定义”
【发布时间】:2009-03-23 11:53:36
【问题描述】:

我认为这是凌晨 5 点的人才流失,但我无法理解这一点。

obj = ['a','b'];
alert( obj.prototype ); //returns "undefined"

为什么obj.prototype 不作为原型返回函数Array(){ }?它确实引用了Array 作为构造函数。

【问题讨论】:

    标签: javascript prototype


    【解决方案1】:

    因为实例没有原型,所以类* 有。

    您可能想要obj.constructor.prototypeobj.constructor==Array

    * 更准确地说,constructor有原型,当然在JS里functions = classes = constructors

    【讨论】:

    • 不,也不是这样。警报(obj.constructor.prototype);什么都不返回。
    • 不,它返回prototype.toString() - 注意这不是null,并且与returnign nothing 不同 - 这是正确的参考,你正在用它做什么可能不是
    • 好的,我想我明白了。所以 obj = 'a', obj = {a:'a'}, obj = ['a'], obj = 0 没有原型,因为它们是实例。但是,obj = function(){} 为其原型返回“[object Object]”
    • 因为函数是一个构造函数,所以它有一个原型 - 函数基本上是唯一你会得到原型引用的东西,无论是原生函数还是你自己的
    • 长话短说 - 函数在 JS 中是特殊的:D
    【解决方案2】:

    我不确定您是否可以从对象实例访问prototype 对象。以下行为可能会对您有所帮助:

    alert(Array); // displays "function Array() { [native code] }"
    alert(Array.prototype); // displays ""
    alert(['a','b'].constructor); // displays "function Array() { [native code] }"
    

    obj.prototype 没有返回 function Array() { ... },因为那是对象的构造函数。

    【讨论】:

    • ‘构造函数’并不可靠;它在 IE 上不存在,并且与它看起来正在做的事情有着微妙的不同,这打破了许多形式的子类化。如果可能,最好避免!
    【解决方案3】:

    在您的示例中,objArray 的实例,而不是 Array 本身的类。

    另一种理解方式是,例如,不能从对象(或类)的实例继承,只能从对象(或类)本身继承,即在您的示例中,这意味着您可以从 Array 对象继承,但不能从 Array 对象的直接实例(例如 obj)继承。

    【讨论】:

    • 谢谢。我针对其他对象类型测试了这个想法,也得到了“未定义”的响应,所以我理解这一点。唯一不同的是这种情况: obj = function(){} 这会返回 [object Object]
    【解决方案4】:

    根据 ECMA 规范,对象的原型链接是不可见的,但大多数现代浏览器(firefox、safari、chrome)都允许您通过 __proto__ 属性看到它,因此请尝试:

    obj = ['a','b'];
    alert( obj.__proto__ );
    

    一个对象在构造时也设置了`constructor'属性,所以你可以试试:

    obj = ['a','b'];
    alert( obj.constructor.prototype );
    

    但是,obj.constructor 可以在对象构造后更改,obj.constructor.prototype 也可以更改,而无需更改 obj 的实际原型指针。

    【讨论】:

      【解决方案5】:

      不是我真正喜欢的茶,但这种定义它的方式是否使“obj”成为一个数组? 试过了

      obj = new Array();
      obj[0] = "a";
      obj[1] = "b";
      

      ?

      【讨论】:

      猜你喜欢
      • 2017-04-14
      • 2013-05-21
      • 1970-01-01
      • 2022-01-21
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      相关资源
      最近更新 更多