Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Виртуальный класс а-ля Си Плас Плас (https://javascript.ru/forum/misc/51128-virtualnyjj-klass-lya-si-plas-plas.html)

Erolast 25.10.2014 06:07

Цитата:

Сообщение от Voronar (Сообщение 337406)
Здравствуйте хочу реализовать сабж в JS.
Есть вот такой код:
function Interface() {};
Interface.prototype.p1 = "property1";

function Class() {};
Class.prototype = new Interface();

var obj = new Class();
console.log(obj.p1);


Так всё работает как надо, но у меня есть один вопрос. Почему в свойстве prototype "класса наследника" Class нужно указывать именно экземпляр функции-конструктора Interface, а не саму функцию-конструктор. А то получается, что нужно сначала потратить память для создания объекта, а потом уже только я получаю возможность "наследования". А если я буду наследовать 20 "классов"?

А это и не правильно. В таком случае наследующий класс не сможет иметь своих методов. Надо, чтобы .prototype.__proto__ наследующего класса было равно .prototype наследуемого. Реализуется как-то так:
function inherits(Child, Parent) {
  Child.prototype = Object.create(Parent.prototype, {
    constructor: {
      writable: true,
      configurable: true,
      enumerable: false
    }
  })
}


Вообще я бы посоветовал смотреть в сторону ES6, если хочется нормального ООП. Это еще неутвержденная спецификация Javascript, пока что на ней можно писать через компиляцию (спасибо kobezzza за ссылку).
class Parent {
  constructor() {

  }
  method() {

  }
}
class Child extends Parent {
  static staticMethod() {

  }
  get getter() {

  }
}

terminator-101 25.10.2014 12:55

Цитата:

Сообщение от Voronar
будет создаваться для каждого экземпляра (так как ты используешь this), а это слишком затратно.

Да, ступил на ночь глядя, бошка не варила. Вот этот вариант не пойдет?
Interface=function(init){
   var o={}
   var base={
      open: function(){console.log("virtual open")},
      close: function(){console.log("virtual close")}
   }
   if(init){
      o.open=init.open||base.open
      o.close=init.close||base.close
   }else{
      o.open=base.open
      o.close=base.close
   }
   return function(){return Object.create(o)}
}

Class1=Interface({open: function(){console.log("just open")}})
Class2=Interface({close: function(){console.log("just close")}})
Class3=Interface()

o1=Class1()
o2=Class2()
o3=Class3()

o1.open(); o1.close(); o2.open(); o2.close(); o3.open(); o3.close()

//  just open
//  virtual close
//  virtual open
//  just close
//  virtual open
//  virtual close

terminator-101 25.10.2014 14:12

Цитата:

Сообщение от Erolast
В таком случае наследующий класс не сможет иметь своих методов

Сможет он их иметь, не надо п*ть, когда не знаешь. Впрочем, тебе не впервой.
function Interface() {};
Interface.prototype.p1 = "property1";
function Class() {this.a=1; this.b=function(){alert(this.a)}};
Class.prototype = new Interface();
var obj = new Class();
alert([obj.p1, obj.a]);
obj.b()

Erolast 25.10.2014 14:45

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

Кстати, с каких это пор ты стал употреблять ; и var?

terminator-101 25.10.2014 14:50

Цитата:

Сообщение от Erolast
Реализуется как-то так:

И что ты написало? Это все равно, что
function Interface() {};
Interface.prototype.p1 = "property1";
 
function Class() {};
Class.prototype = Interface.prototype;
 
var obj = new Class();

Обсуждали уже в начале топика, ему надо чтобы изменение дочернего класса не влияло на Interface, идиот. А ты написал то же самое, только мудреным синтаксисом (чтоб никто не догадался опять?)

function inherits(Child, Parent) {
  Child.prototype = Object.create(Parent.prototype, {
    constructor: {
      writable: true,
      configurable: true,
      enumerable: false
    }
  })
}


O=function(){}
O.prototype={a:1}
Child=function(){}
inherits(Child, O)
o=new Child
console.log(o.a)
Child.prototype.a=10
console.log(o.a)
o1=new Child
console.log(o1.a)

//  1
//  10
//  10

Не лезь в треды, где мужики разговаривают, пиши жеквери, это самое твое.

terminator-101 25.10.2014 14:52

Цитата:

Сообщение от Erolast
При этом каждый новый инстанс будет иметь свою собственную пачку методов, что в большинстве случаев нецелесообразно и приводит к перерасходу памяти

Это не имеет никакого отношения к делу. Как там быдло что называет, никого не волнует. С точки зрения работы кода, это именно то, о чем ты кукарекал. А свою жаба-терминологию держи при себе.
Цитата:

Сообщение от Erolast
к перерасходу памяти

Это можно легко решить, но я распинаться перед тобой не буду, один х не поймшь

terminator-101 25.10.2014 14:59

Цитата:

Сообщение от Erolast
Кстати, с каких это пор ты стал употреблять ; и var?

Это паста была, я их не употребляю, там где не надо, в отличии от быдлятины, которая лепит их везде.

terminator-101 25.10.2014 15:03

Цитата:

Сообщение от Erolast
Кстати, с каких это пор ты стал употреблять ; и var?

Ты про какой, вообще кусок говоришь? Если про этот, http://javascript.ru/forum/showthrea...515#post337475, то там все по делу употреблено, ущерб, там без них код не отработает. Я что говорил, что нигде употреблять не надо? Разупорись.

Erolast 25.10.2014 15:03

Цитата:

Обсуждали уже в начале топика, ему надо чтобы изменение дочернего класса не влияло на Interface, идиот.
А при такой реализации оно и не будет влиять, идиот.
Цитата:

ты написал то же самое, только мудреным синтаксисом (чтоб никто не догадался опять?)
Нет, не то же.
Цитата:

Не лезь в треды, где мужики разговаривают, пиши жеквери, это самое твое.

Это не имеет никакого отношения к делу. Как там быдло что называет, никого не волнует. С точки зрения работы кода, это именно то, о чем ты кукарекал. А свою жаба-терминологию держи при себе.

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

terminator-101 25.10.2014 15:12

Цитата:

Сообщение от Erolast
А при такой реализации оно и не будет влиять, идиот.

Ты мудило кнокпу run нажми хотя бы для приличия


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