Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function test() {
var a = 10;
return function() {
console.log(window['a']);
};
};
test()(); //undefined
function test() {
var a = 10;
return function() {
console.log(a);
};
};
test()(); //10
(Стоит упомянуть что браузеры сохраняют ссылку на прототип в свойстве __proto__, но его использование очень портит карму, как минимум потому что его нет в стандарте ECMAScript, так что не надо его использовать).
All objects have an internal property called [[Prototype]]. The value of this property is either null or an object and is used for implementing inheritance. Whether or not a native object can have a host object as its [[Prototype]] depends on the implementation...
__proto__ поддерживается везде и внесено в проект ECMAScript 6.__proto__ — это геттер/сеттер в прототипе объекта (Object.prototype.__proto__), а не самого объекта.var o = Object.create(null);
o.__proto__; // => undefined, потому что мы не имеем доступа к Object#__proto__
// но
Object.getPrototypeOf(o); // => null
console.log(p1.prototype); // выводит 'undefined'
console.log(p1.prototype.getFullName()); // выкидывает ошибку
При использовании прототипного наследования, помните о том, что свойства прототипа нужно (??) задавать после наследования от родительского объекта.
When using prototypal inheritance, remember to define properties in the prototype after having either inherited from the parent class or specified an alternate prototype.
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
var p1 = new Person('John', 'Doe');
var p2 = new Person('Robert', 'Doe');
Всё, что вы должны знать о прототипах, замыканиях и производительности