Code Example 1: Setting a prototype
❓ Что выведут rabbit.jumps и rabbit.eats? Откуда берётся значение eats?
var animal = {
eats: true
};
var rabbit = {
jumps: true
};
rabbit.__proto__ = animal;
console.log(rabbit.jumps);
console.log(rabbit.eats);
Code Example 2: Property lookup
❓ Как JavaScript ищет свойство rabbit.eats? Какие шаги выполняет движок?
var animal = { eats: true };
var rabbit = { jumps: true };
rabbit.__proto__ = animal;
console.log(rabbit.eats);
Code Example 3: Standard prototype chain
❓ Какова цепочка прототипов для обычного объекта obj? Что выведут все console.log?
var obj = { x: 1 };
console.log(obj.__proto__ === Object.prototype);
console.log(Object.prototype.__proto__ === null);
console.log(obj.toString());
console.log(obj.hasOwnProperty('x'));
Code Example 4: Multi-level chain
❓ Какова цепочка прототипов для longEar? Что выведет каждый console.log?
var animal = {
eats: true,
walk: function() {
console.log('Идёт');
}
};
var rabbit = {
jumps: true
};
rabbit.__proto__ = animal;
var longEar = {
earLength: 10
};
longEar.__proto__ = rabbit;
console.log(longEar.earLength);
console.log(longEar.jumps);
console.log(longEar.eats);
console.log(longEar.toString);
Code Example 5: Reading vs Writing properties
❓ Что выведут rabbit.eats и animal.eats после записи? Почему запись не затрагивает прототип?
var animal = {
eats: true,
walk: function() {
console.log('Идёт');
}
};
var rabbit = {};
rabbit.__proto__ = animal;
console.log(rabbit.eats);
rabbit.eats = false;
console.log(rabbit.eats);
console.log(animal.eats);
console.log(rabbit.hasOwnProperty('eats'));
Code Example 6: Array prototype chain
❓ Какова цепочка прототипов для массива? Откуда массив наследует методы push и toString?
var arr = [1, 2, 3];
console.log(arr.__proto__ === Array.prototype);
console.log(Array.prototype.__proto__ === Object.prototype);
arr.push(4);
arr.toString();
Code Example 7: Function prototype chain
❓ Какова цепочка прототипов для функции? Откуда функция наследует метод call?
function fn() {}
console.log(fn.__proto__ === Function.prototype);
console.log(Function.prototype.__proto__ === Object.prototype);
fn.call();
fn.toString();
Code Example 8: Object.create(null)
❓ Чем объект без прототипа отличается от обычного? Что выведет noProto.toString?
var noProto = Object.create(null);
console.log(noProto.__proto__);
console.log(noProto.toString);
noProto['hasOwnProperty'] = 'значение';
Code Example 9: Changing prototype affects all objects
❓ Что выведет rabbit.eats после изменения animal.eats? Почему?
var animal = { eats: true };
var rabbit = {};
rabbit.__proto__ = animal;
console.log(rabbit.eats);
animal.eats = false;
console.log(rabbit.eats);
animal.sleep = function() {
console.log('Спит');
};
rabbit.sleep();