метаобъектный протокол
Звучит устрашающе-внушительно. Но прочитал вот такое определение,
Метаобъектный протокол — это механизм для определения и использования новых метаклассов. Метаобъектный протокол определяет множество функций, которые содержат методы для классов. Программирование на уровне метаобъектного протокола — это определение новых классов вместе с методами для этих классов. перестал боятся и наговнял вот такую реализацию на js /////////////////////////////////////////////////////////////////////// //prepare: Object.defineProperty(Object.prototype, "extend", { value: function(src){ for(var i in src){this[i]=src[i]} }, enumerable: false }) Nigger=function(){} // левый класс Nigger.prototype.color="black" ///////////////////////////////////////////////////////////////////////// //implementation: Class=function(classProperties, opt){ var f=function(init){ if(opt) if(opt.object) this.extend(opt.object) this.extend(init) } if(opt) if(opt.parent) { f.prototype=Object.create(opt.parent.prototype) f.prototype.constructor=f } f.prototype.extend(classProperties) return f } ////////////////////////////////////////// //example Person=new Class({legs: 2, hands: 2, head: 1}, {object: {a: 1}, parent: Nigger}) person1=new Person({name: "Jack"}) person2=new Person({name: "John"}) with(person1){console.log(color, hands, name)} with(person2){console.log(color, hands, name)} Person.prototype.footballFan=true // пусть экземпляры нашего класса person будут футбольными болельщиками Nigger.prototype.teeth="white" // пусть левый нигер теперь с белыми зубами with(person1){console.log(color, hands, name, teeth, footballFan)} with(person2){console.log(color, hands, name, teeth, footballFan)} // black 2 Jack // black 2 John // black 2 Jack white true // black 2 John white true Мы создали конструктор классов, затем определили с помощью него класс. Опционально, в конструкторе можно указать родителя класса — суперкласс (в нашем случае — нигер — совершенно левый класс), а также слоты экземпляров создаваемого класса. Все классы расширяются динамически. А между тем, если вбить в гугл запрос "метаобъектный протокол" (он же MOP) выскакивают результаты только для CL, причем, что сука характерно, лисперы для этого зах*рили жирную либу, поверх другой жирной либы -- CLOS, тогда как в JS все имплементится в несколько строк, можно сказать, есть нативная поддержка, LOL |
krutoy,
При попытке запустить выдает следующее: Цитата:
krutoy, не стоит менять базовые прототипы. |
tsigel,
Ты где запускаешь? в FF работает, на v8 в ноде тоже работало. |
krutoy,
на маке в хроме. |
tsigel,
Ты, видимо, запускаешь с какой то либой, где уже установлен extend. Убери либу или смени имя. |
krutoy,
нет никаких либ. Плагины в браузере тоже отключены |
Цитата:
|
krutoy,
На разных платформах даже одинаковые браузеры ведут себя по разному, я это давно замечал :) |
tsigel,
Значит выкинь свой мак на помойку. Это ж для голубых, как не стыдно:) Юзай openBSD |
krutoy,
Ну и пиши свои приложения только для Linux & Windows :) |
tsigel,
Там ясно, что у тебя extend конфликтует с чем-то. Скопируй код, смени имя и выполни локально. Можешь в ноде выполнить. |
krutoy,
Это просто вполне очевидный пример того что не стоит трогать базовые прототипы |
tsigel,
/////////////////////////////////////////////////////////////////////// //prepare: Object.defineProperty(Object.prototype, "extend111", { value: function(src){ for(var i in src){this[i]=src[i]} }, enumerable: false }) Nigger=function(){} // левый класс Nigger.prototype.color="black" ///////////////////////////////////////////////////////////////////////// //implementation: Class=function(classProperties, opt){ var f=function(init){ if(opt) if(opt.object) this.extend111(opt.object) this.extend111(init) } if(opt) if(opt.parent) { f.prototype=Object.create(opt.parent.prototype) f.prototype.constructor=f } f.prototype.extend111(classProperties) return f } ////////////////////////////////////////// //example Person=new Class({legs: 2, hands: 2, head: 1}, {object: {a: 1}, parent: Nigger}) person1=new Person({name: "Jack"}) person2=new Person({name: "John"}) with(person1){console.log(color, hands, name)} with(person2){console.log(color, hands, name)} Person.prototype.footballFan=true // пусть экземпляры нашего класса person будут футбольными болельщиками Nigger.prototype.teeth="white" // пусть левый нигер теперь с белыми зубами with(person1){console.log(color, hands, name, teeth, footballFan)} with(person2){console.log(color, hands, name, teeth, footballFan)} // black 2 Jack // black 2 John // black 2 Jack white true // black 2 John white true за тебя сделал, пробуй |
tsigel,
Вот как раз сраные яблочники и сделали это, мудаки. А мой пример для теста, это ж не либа. |
Цитата:
|
Крутой, если я правильно понял твою задачу, то это уже реализовано в ES6:
class Man prototype Human.prototype <| { size: 6, weight: 80 } { fart() { } } |
Цитата:
Допустим man1=new Man Human.prortotype.foo="bar" man1.foo -- ??? что покажет последняя строка? |
"bar". Там выйдет такая цепочка прототипов:
var man = new Man(); console.log(man.__proto__); // {size: 6, weight: 80} console.log(man.__proto__.__proto__ == Human.prototype); // true (Да, я знаю, что __proto__ устарел, просто для краткости). |
Erolast,
Ну да, это, похоже, почти то же самое. |
Часовой пояс GMT +3, время: 09:34. |