Ты не понял. Никто не говорит о том, что нужно отказаться от 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, время: 01:42. |