2 разных объявления массива литералов в объекте ссылаются друг на друга - PullRequest
0 голосов
/ 07 января 2019

я хочу знать, как в этом объекте, когда он объявляет и использует 2 литеральных массива, они оба ссылаются друг на друга

var o = {
    push:[].push,
    length:0,
    toString:[].join,
    valueOf:function(){
    return arguments[0] == "number" ? this.length : this.toString();
   }
};

o.push(1, 2, 3);

o.toString(); // "1,2,3"
(o*1).toString(); // 3

Ничего, это фундаментально, я думаю

код не нужен

как 2 разных литеральных массива ссылаются друг на друга

1 Ответ

0 голосов
/ 07 января 2019

Два массива не ссылаются друг на друга. Фактически, ни один из этих массивов больше не существует, как только вы создали o. Вы просто создаете их, получаете ссылку на их push и join методы, а затем выбрасываете массивы. Эти методы не имеют обратной связи с массивами, из которых вы их получили.

Причина, по которой вы видите то, что вы видите, в том, что push использует o, а не массивы, из которых вы получили методы. (push работает просто отлично, если вы вызываете его для не-массива; большинство методов массива делают).

Вот более простая ситуация, демонстрирующая ту же концепцию:

var obj1 = {
    setValue: function(value) {
        this.value = value;
    }
};
var obj2 = {
    setValue: obj1.setValue,
    showValue: function() {
        console.log(this.value);
    }
};

obj2.setValue(42);
obj2.showValue(); // 42

setValue устанавливает значение на obj2, а не obj1, потому что оно называлось obj2.setValue(42).

Подробнее:

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