Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 25.10.2014, 06:07
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Сообщение от Voronar Посмотреть сообщение
Здравствуйте хочу реализовать сабж в 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() {

  }
}

Последний раз редактировалось Erolast, 25.10.2014 в 16:16.
Ответить с цитированием
  #12 (permalink)  
Старый 25.10.2014, 12:55
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от 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
Ответить с цитированием
  #13 (permalink)  
Старый 25.10.2014, 14:12
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от 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()
Ответить с цитированием
  #14 (permalink)  
Старый 25.10.2014, 14:45
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

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

Последний раз редактировалось Erolast, 25.10.2014 в 14:48.
Ответить с цитированием
  #15 (permalink)  
Старый 25.10.2014, 14:50
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от 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:57.
Ответить с цитированием
  #16 (permalink)  
Старый 25.10.2014, 14:52
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от Erolast
При этом каждый новый инстанс будет иметь свою собственную пачку методов, что в большинстве случаев нецелесообразно и приводит к перерасходу памяти
Это не имеет никакого отношения к делу. Как там быдло что называет, никого не волнует. С точки зрения работы кода, это именно то, о чем ты кукарекал. А свою жаба-терминологию держи при себе.
Сообщение от Erolast
к перерасходу памяти
Это можно легко решить, но я распинаться перед тобой не буду, один х не поймшь
Ответить с цитированием
  #17 (permalink)  
Старый 25.10.2014, 14:59
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от Erolast
Кстати, с каких это пор ты стал употреблять ; и var?
Это паста была, я их не употребляю, там где не надо, в отличии от быдлятины, которая лепит их везде.
Ответить с цитированием
  #18 (permalink)  
Старый 25.10.2014, 15:03
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от Erolast
Кстати, с каких это пор ты стал употреблять ; и var?
Ты про какой, вообще кусок говоришь? Если про этот, http://javascript.ru/forum/showthrea...515#post337475, то там все по делу употреблено, ущерб, там без них код не отработает. Я что говорил, что нигде употреблять не надо? Разупорись.
Ответить с цитированием
  #19 (permalink)  
Старый 25.10.2014, 15:03
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

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

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

Последний раз редактировалось Erolast, 25.10.2014 в 15:08.
Ответить с цитированием
  #20 (permalink)  
Старый 25.10.2014, 15:12
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от terminator-101
 
Регистрация: 14.10.2014
Сообщений: 117

Сообщение от Erolast
А при такой реализации оно и не будет влиять, идиот.
Ты мудило кнокпу run нажми хотя бы для приличия
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить / удалить класс кликом fabrique Общие вопросы Javascript 4 03.09.2014 04:43
Изменить класс родительского элемента STyLe Общие вопросы Javascript 1 29.05.2014 20:21
Как удалить класс у соседних элементов housewm Events/DOM/Window 4 11.03.2014 13:29
Передал аяксом класс в <div>, но как отловить событите клик на этот класс ? saturn Элементы интерфейса 11 31.05.2012 10:30
Jquery немогу установить класс! shureg Общие вопросы Javascript 4 26.10.2010 14:37