为什么我不能覆盖`Array`(`Array.prototype`)的原型?

时间:2012-10-10 02:53:24

标签: javascript

我将Array的原型设置为 my 的实例,我认为book.aa会显示"aa",但会显示"undefined" 1}},为什么?谢谢!

   <html>
    <head>
        <title>Array Properties</title>
        <h2>Array Properties</h2>
        <script type="text/javascript">
            function my() {
                this.aa = 'aa';
            }
            Array.prototype = new my();
            Array.prototype.bb = "bb";
            var book = new Array();  
            book[0] = "War and Peace";  

        </script>
    </head>
    <body bgcolor="lightblue">
        <script type="text/javascript">
            document.write(book.aa+book.bb);
        </script>
    </body>

    </html>

2 个答案:

答案 0 :(得分:7)

您无法分配到Array.prototype,因为prototypeArray的只读属性。

所以当你写

Array.prototype = new my();
没有任何反应。要了解原因,请尝试

JSON.stringify(Object.getOwnPropertyDescriptor(Array, "prototype"))

结果是

"{"value":[],"writable":false,"enumerable":false,"configurable":false}"

除非您处于严格模式,否则作业将无声地失败。

这就是原因 - 并且看http://jsfiddle.net/5Ysub/ - 如果你执行

function my() {
    this.aa = 'aa';
}
Array.prototype = new my();
Array.prototype.bb = "bb";
var book = new Array();
book[0] = "War and Peace";
document.write(book.aa+book.bb);

你得到了

undefinedbb

bb有效,因为您在创建并设置Array.prototype属性时已分配到真实 bb

Array.prototype不能被打击是件好事,恕我直言。 :)

答案 1 :(得分:0)

即使你可以直接覆盖Array.prototype,你也会失去对所有内置方法的访问权限,例如splice,slice,push,shift,pop,unshift,sort,reverse还有很多其他......所以这将是一个糟糕的编码实践。但它没有像Ray指出的那样有效,因为它只是只读的。

这个很小的代码片段将证明无法覆盖Array.prototype,因为sort方法仍将执行:

<script type="text/javascript">
Array.prototype={};
var a=new Array(1,4,5,7,8);
a.sort();
alert(a.join(","));
</script>

如果要覆盖Array.prototype的原型属性,则必须一次执行一次,如下所示: Array.prototype.aa='aa';

如果要将大量属性应用于Array.prototype,请通过循环应用它。以下是我为您编写的一些代码,它们应该完全符合您的要求:

<script type="text/javascript">
function my()
{
    this.aa = 'aa';
}
my.prototype.bb = "bb";
var instance = new my();
for(var j in instance)
{
    if(instance.hasOwnProperty(j) || j in my.prototype)
    {
        Array.prototype[j]=instance[j];
    }
}

var book=new Array();
book[0]="War and Peace";
alert(book.aa);//alerts "aa"
alert(book.bb);//alerts "bb"
</script>