Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   метаобъектный протокол (https://javascript.ru/forum/misc/52296-metaobektnyjj-protokol.html)

krutoy 12.12.2014 12:39

метаобъектный протокол
 
Звучит устрашающе-внушительно. Но прочитал вот такое определение,

Метаобъектный протокол — это механизм для определения и использования новых метаклассов.

Метаобъектный протокол определяет множество функций, которые содержат методы для классов. Программирование на уровне метаобъектного протокола — это определение новых классов вместе с методами для этих классов.

перестал боятся и наговнял вот такую реализацию на 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

tsigel 12.12.2014 16:09

krutoy,
При попытке запустить выдает следующее:
Цитата:

error: Cannot redefine property: extend

Так таков и был план?

krutoy, не стоит менять базовые прототипы.

krutoy 12.12.2014 16:13

tsigel,
Ты где запускаешь? в FF работает, на v8 в ноде тоже работало.

tsigel 12.12.2014 16:15

krutoy,
на маке в хроме.

krutoy 12.12.2014 16:15

tsigel,
Ты, видимо, запускаешь с какой то либой, где уже установлен extend. Убери либу или смени имя.

tsigel 12.12.2014 16:16

krutoy,
нет никаких либ. Плагины в браузере тоже отключены

krutoy 12.12.2014 16:17

Цитата:

Сообщение от tsigel
в хроме.

на венде в хроме работает

tsigel 12.12.2014 16:18

krutoy,
На разных платформах даже одинаковые браузеры ведут себя по разному, я это давно замечал :)

krutoy 12.12.2014 16:19

tsigel,
Значит выкинь свой мак на помойку. Это ж для голубых, как не стыдно:) Юзай openBSD

tsigel 12.12.2014 16:20

krutoy,
Ну и пиши свои приложения только для Linux & Windows :)

krutoy 12.12.2014 16:21

tsigel,
Там ясно, что у тебя extend конфликтует с чем-то. Скопируй код, смени имя и выполни локально. Можешь в ноде выполнить.

tsigel 12.12.2014 16:23

krutoy,
Это просто вполне очевидный пример того что не стоит трогать базовые прототипы

krutoy 12.12.2014 16:24

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

за тебя сделал, пробуй

krutoy 12.12.2014 16:25

tsigel,
Вот как раз сраные яблочники и сделали это, мудаки. А мой пример для теста, это ж не либа.

krutoy 12.12.2014 16:30

Цитата:

Сообщение от tsigel
базовые прототипы

там это вообще не принципиально, можно в экстенд кидать объект явным аргументом, это на суть не повлияет, просто сахарней и удобней. А расширять надо, язык под это заточен, только с умом.

Erolast 12.12.2014 17:49

Крутой, если я правильно понял твою задачу, то это уже реализовано в ES6:
class Man prototype Human.prototype <| {
  size: 6,
  weight: 80
} {
  fart() {

  }
}

krutoy 12.12.2014 17:53

Цитата:

Сообщение от Erolast
это уже реализовано в ES6:

Возможно, я его не знаю, ничего сказать не могу.
Допустим
man1=new Man
Human.prortotype.foo="bar"
man1.foo -- ???

что покажет последняя строка?

Erolast 12.12.2014 18:10

"bar". Там выйдет такая цепочка прототипов:
var man = new Man();
console.log(man.__proto__); // {size: 6, weight: 80}
console.log(man.__proto__.__proto__ == Human.prototype); // true

(Да, я знаю, что __proto__ устарел, просто для краткости).

krutoy 12.12.2014 18:12

Erolast,
Ну да, это, похоже, почти то же самое.


Часовой пояс GMT +3, время: 09:34.