Javascript Koans - не может решить ни одного теста - PullRequest
0 голосов
/ 24 июля 2011

Я пытаюсь решить тест из Javascript Koans и застрял на блоке «отражения». Может ли кто-нибудь решить и объяснить решение для следующего блока:

    test("hasOwnProperty", function() {
    // hasOwnProperty returns true if the parameter is a property directly on the object, 
    // but not if it is a property accessible via the prototype chain.    
    var keys = [];
    var fruits =  ['apple', 'orange'];
    for(propertyName in fruits) {
        keys.push(propertyName);
    }
    ok(keys.equalTo(['__','__', '__']), 'what are the properties of the array?');

    var ownKeys = [];
    for(propertyName in fruits) {
        if (fruits.hasOwnProperty(propertyName)) {
            ownKeys.push(propertyName);
        }
    }
    ok(ownKeys.equalTo(['__', '__']), 'what are the own properties of the array?');
    });

1 Ответ

1 голос
/ 11 августа 2011

Вы должны знать, что JavaScript имеет классическую модель прототипного наследования вместо классической.Фактически это означает, что наследование осуществляется через то, что называется цепями прототипов .

Когда вы пытаетесь получить доступ к свойствам массива с помощью «for in», он будет «подниматься» по цепочке прототипов вплоть до arrayname.prototype, так как он наследуется от него!Если вы хотите узнать больше об этой функции, я настоятельно рекомендую вам взглянуть на JavaScript Garden от Ivo Wetzel, где я и нашел свои ответы!

В остальном выТакже следует знать, что javascript ссылается на «собственные» свойства массива как десятичные числа, т. е .: первое свойство равно «0», второе - «1» и т. д.

Итак, решение выглядит так:*

test("hasOwnProperty", function() {
// hasOwnProperty returns true if the parameter is a property directly on the object, 
// but not if it is a property accessible via the prototype chain.
var keys = [];
var fruits =  ['apple', 'orange'];
for(propertyName in fruits) {
    keys.push(propertyName);
}
ok(keys.equalTo(['0', '1', 'fruits.prototype'), 'what are the properties of the array?');

var ownKeys = [];
for(propertyName in fruits) {
    if (fruits.hasOwnProperty(propertyName)) {
        ownKeys.push(propertyName);
    }
}
ok(ownKeys.equalTo(['0', '1']), 'what are the own properties of the array?');

});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...