Ты не понял. Никто не говорит о том, что нужно отказаться от new и использовать Object.create - это, конечно, бред. Object.create надо использовать в функции inherits, ибо нам нужен чистый объект с [[Prototype]], равным прототипу наследуемого класса, без всякой хрени от конструктора.
Цитата:
|
Цитата:
|
Цитата:
Child.prototype.constructor = Child; |
Цитата:
|
Цитата:
|
Кстати, ничего страшного не будет, если я стандартному объекту добавлю метод, чтобы наследование получилось более изящным с точки зрения синтаксиса:
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, только не таким образом, ибо:
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 }); |
Aetae
Спасибо, и вправду классная вещь этот Object.defineProperty(). |
Цитата:
Object.prototype.extends = function(){ alert('extends') }; var newObj = {foo: 'bar'}; for(var key in newObj) {if(!(newObj.hasOwnProperty(key))) break; alert(key)}; Тот кто итерирует, должен понимать, что и зачем он итерирует. А проблемы дебила шерифа не е*ут. |
Voronar,
Если нужна поддержка IE-8, забудь, если я не ошибаюсь, не поддерживает он эту хрень, недавно тема тут была. |
Часовой пояс GMT +3, время: 16:41. |