Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
var a = 2;
a.a = 3;
console.log(a.a);
var a = new Number(2);
a.a = 6;
console.log(+a, a.a);
JS – единственный популярный язык с прототипным наследованием
obj.__class__ = Bar
взять любой объект и одним движением сделать его прототипом для другого
Object.create(proto[, propertiesObject])
Throws a TypeError exception if the proto parameter isn't null or an object.
var proto = Object.create(null);
console.log(proto instanceof Object); // => false
var instance = Object.create(proto);
console.log(instance instanceof Object); // => false
function f(){}
console.log(f.isPrototypeOf(Object.create(f))); // => true
console.log(Object.getPrototypeOf(function(){}) === Function.prototype); // => true
console.log(Object.getPrototypeOf(class {}) === Function.prototype); // => true
console.log(Object.getPrototypeOf((function(){}).prototype) === Object.prototype); // => true
console.log(Object.getPrototypeOf((class {}).prototype) === Object.prototype); // => true
Просто в ES5 нет выделенного Class object.Вот именно это и отличает прототипное наследование от классического.
В ES6 уже есть Class (object, prototype of all classes).Ничего подобного, в ES6 не добавили ничего кроме сахара. «Выделенный Class object», что бы вы под ним не понимали, к использованию не обязателен.
Вот именно это и отличает прототипное наследование от классического.
boo.foo();
var method = getObjectProperty(boo,"foo");
method.call( boo, method );
Тут собраны советы по тому, как избежать распространённых ошибок и малозаметных багов, а также проблем с быстродействием и неправильного стиля программирования.
Bar.prototype = new Foo(); // Не делайте такого! Не плодите лишние объекты, когда у вас прототип уже и так объявлен!
Bar.prototype = Object.create(Foo.prototype); // Так правильно
for(var i in foo) {
if (foo.hasOwnProperty(i)) {
console.log(i);
}
}
НЕ используйте delete, вообще никогда!
delete это такое же изменение структуры объекта, как и добавление нового свойства в него. Да, это изменение внутреннего класса объекта, да, это плохо для структур / инстансов. Но в словарях без этого никуда. Да, Google в своём SoundScript предлагает использовать в качестве словарей исключительно Map. Вот только это пока не реально.Этот код о-о-очень медленный. Вообще забудьте что у JS есть оператор in.
hasOwnProperty в этом случае вообще не нужна, а в такой форме даже вредна. Что касается «о-о-очень медленный» — то только в случае с перечислимыми свойствами в прототипе, с плоскими объектами for-in незначительно отстаёт только в V8, в остальных быстрее, чем Object.keys. Про оператор in даже комментировать желания нет.delete это такое же изменение структуры объекта, как и добавление нового свойства в него.
Что касается «о-о-очень медленный» — то только в случае с перечислимыми свойствами в прототипе
Это называется «обезьяньими заплатками»
Сад JavaScript: Объекты