25.10.2014, 21:16
|
|
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Ты не понял. Никто не говорит о том, что нужно отказаться от new и использовать Object.create - это, конечно, бред. Object.create надо использовать в функции inherits, ибо нам нужен чистый объект с [[Prototype]], равным прототипу наследуемого класса, без всякой хрени от конструктора.
Цитата:
|
Мы это могли бы делать и по старинке. {__proto__: example}
|
Динамическое изменение свойства [[Prototype]] объекта вызовет проблемы с производительностью, ибо это неожиданная неоптимизируемая операция.
|
|
25.10.2014, 21:28
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от Erolast
|
Никто не говорит о том, что нужно отказаться от new и использовать Object.create
|
Я говорю. Это унылый быдлокод, который плодит лишние объекты в цепочки прототипов.
|
|
25.10.2014, 21:33
|
Аспирант
|
|
Регистрация: 15.02.2013
Сообщений: 55
|
|
Сообщение от Erolast
|
И не буду, пример неверен. Надо так:
function inherits(Child, Parent) {
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
}
function Interface(){};
function Class(){};
inherits(Class, Interface);
Interface.prototype.someValue = 1;
Class.prototype.someValue = 2;
alert((new Interface()).someValue);
alert((new Class()).someValue);
|
Кстати, а нельзя вместо объекта во 2-ом аргументе create, просто написать вот так:
Child.prototype.constructor = Child;
|
|
25.10.2014, 23:03
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от Sweet
|
который плодит лишние объекты в цепочки прототипов.
|
Ну ка покажи пример таких "лишних" объектов, а то возникает ощущение, что ты них*я не понимаешь о чем ты говоришь.
|
|
25.10.2014, 23:05
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Сообщение от Sweet
|
Я говорю. Это унылый быдлокод, который плодит лишние объекты в цепочки прототипов.
|
Ты глупости говориь. Сомотри: если тебе нужно чтобы у ребёнка были свои методы помимо методов родителя - тебе так или иначе не обойтись без объекта эти методы хранящего, так? Так где же "лишние объекты"?
__________________
29375, 35
|
|
25.10.2014, 23:13
|
Аспирант
|
|
Регистрация: 15.02.2013
Сообщений: 55
|
|
Кстати, ничего страшного не будет, если я стандартному объекту добавлю метод, чтобы наследование получилось более изящным с точки зрения синтаксиса:
Object.prototype.extends = function(parent)
{
this.prototype = Object.create(parent);
this.prototype.constructor = this;
};
var Interface =
{
fd : "default descriptor"
};
function Class1() {};
Class1.extends(Interface);
function Class2() {};
Class2.extends(Interface);
Class1.prototype.fd = "class1 descriptor";
var obj1 = new Class1();
var obj2 = new Class2();
//var obj = new Interface(); //ошибка, так как нельзя создать экземпляр виртуального класса
alert(obj1.fd);
alert(obj2.fd);
Последний раз редактировалось Voronar, 25.10.2014 в 23:21.
|
|
25.10.2014, 23:24
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Voronar, только не таким образом, ибо:
Object.prototype.extends = function(){ alert('extends') };
var newObj = {foo: 'bar'};
for(var key in newObj) alert(key);
это может поломать чужой код.
Надо примерно так:
Object.defineProperty(Object.prototype, 'extends', {
value: function(){},
enumerable: *!*false*/!*,
writable: true,
configurable: true
});
__________________
29375, 35
Последний раз редактировалось Aetae, 25.10.2014 в 23:26.
|
|
25.10.2014, 23:44
|
Аспирант
|
|
Регистрация: 15.02.2013
Сообщений: 55
|
|
Aetae
Спасибо, и вправду классная вещь этот Object.defineProperty().
|
|
25.10.2014, 23:53
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от Aetae
|
это может поломать чужой код.
|
По-идее, эта мантра проповедуется сейчас массово, но проблема высосана из пальца.
Object.prototype.extends = function(){ alert('extends') };
var newObj = {foo: 'bar'};
for(var key in newObj) {if(!(newObj.hasOwnProperty(key))) break; alert(key)};
Тот кто итерирует, должен понимать, что и зачем он итерирует. А проблемы дебила шерифа не е*ут.
|
|
25.10.2014, 23:57
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Voronar,
Если нужна поддержка IE-8, забудь, если я не ошибаюсь, не поддерживает он эту хрень, недавно тема тут была.
|
|
|
|