Члены объекта Javascript, прототипы которых представляют собой массивы, становятся общий для всех экземпляров класса

Кто-нибудь раньше замечал такое поведение? Это действительно сбило меня с толку ... Я ожидал, что прототипы массивов будут частными для каждого экземпляра класса, а не будут совместно использоваться всеми экземплярами класса.

Может ли кто-нибудь проверить, что это правильное поведение, и, возможно, объяснить это поведение более подробно?

Обратите внимание на закомментированный код и то, как он влияет на поведение скрипта.

<html>
<head>

<script type="text/javascript">

function print_r( title, object ) {

    var output = '';
    for( var key in object ) {

        output += key + ": " + object[ key ] + "\n";

    }

    output = title + "\n\n" + output;

    alert( output );

}

function Sandwich() {

    // Uncomment this to fix the problem
    //this.ingredients = [];

}

Sandwich.prototype = {

    "ingredients" : [],
    "addIngredients" : function( ingArray ) {

        for( var key in ingArray ) {

            this.addIngredient( ingArray[ key ] );

        }

    },
    "addIngredient" : function( thing ) {

        this.ingredients.push( thing );

    }

}

var cheeseburger = new Sandwich();
cheeseburger.addIngredients( [ "burger", "cheese" ] );

var blt = new Sandwich();
blt.addIngredients( [ "bacon", "lettuce", "tomato" ] );

var spicy_chicken_sandwich = new Sandwich();
spicy_chicken_sandwich.addIngredients( [ "spicy chicken pattie", "lettuce", "tomato", "honey dijon mayo", "love" ] );

var onLoad = function() {

    print_r( "Cheeseburger contains:", cheeseburger.ingredients );

};

</script>

</head>
<body onload="onLoad();">
</body>
</html>

Большое спасибо.

22
задан Dan 13 December 2010 в 02:10
поделиться