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

Hel*_*oCW 5 javascript

我将原型设置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>
Run Code Online (Sandbox Code Playgroud)

Ray*_*oal 7

您无法分配,Array.prototype因为prototype是只读属性Array.

所以当你写作

Array.prototype = new my();
Run Code Online (Sandbox Code Playgroud)

什么都没发生.要了解原因,请尝试

JSON.stringify(Object.getOwnPropertyDescriptor(Array, "prototype"))
Run Code Online (Sandbox Code Playgroud)

结果是

"{"value":[],"writable":false,"enumerable":false,"configurable":false}"
Run Code Online (Sandbox Code Playgroud)

除非您处于严格模式,否则分配将无效.

这就是原因 - 并且看看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);
Run Code Online (Sandbox Code Playgroud)

你得到

undefinedbb
Run Code Online (Sandbox Code Playgroud)

这些bb作品是因为您在创建和设置属性时已分配到实际 .Array.prototypebb

Array.prototype恕我直言,这是一件不容易被打击的好事.:)