5

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

   <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>
4

2 回答 2

7

您不能分配给,Array.prototype因为prototype它是 的只读属性Array

所以当你写

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.prototypebb

Array.prototype恕我直言,这是一件不能被击垮的好事。:)

于 2012-10-10T02:56:17.603 回答
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>
于 2012-10-10T03:32:56.017 回答