【发布时间】:2009-03-23 11:53:36
【问题描述】:
我认为这是凌晨 5 点的人才流失,但我无法理解这一点。
obj = ['a','b'];
alert( obj.prototype ); //returns "undefined"
为什么obj.prototype 不作为原型返回函数Array(){ }?它确实引用了Array 作为构造函数。
【问题讨论】:
标签: javascript prototype
我认为这是凌晨 5 点的人才流失,但我无法理解这一点。
obj = ['a','b'];
alert( obj.prototype ); //returns "undefined"
为什么obj.prototype 不作为原型返回函数Array(){ }?它确实引用了Array 作为构造函数。
【问题讨论】:
标签: javascript prototype
因为实例没有原型,所以类* 有。
您可能想要obj.constructor.prototype 或obj.constructor==Array
* 更准确地说,constructor有原型,当然在JS里functions = classes = constructors
【讨论】:
我不确定您是否可以从对象实例访问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() { ... },因为那是对象的构造函数。
【讨论】:
在您的示例中,obj 是 Array 的实例,而不是 Array 本身的类。
另一种理解方式是,例如,不能从对象(或类)的实例继承,只能从对象(或类)本身继承,即在您的示例中,这意味着您可以从 Array 对象继承,但不能从 Array 对象的直接实例(例如 obj)继承。
【讨论】:
根据 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 的实际原型指针。
【讨论】:
不是我真正喜欢的茶,但这种定义它的方式是否使“obj”成为一个数组? 试过了
obj = new Array();
obj[0] = "a";
obj[1] = "b";
?
【讨论】: