![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 06:07
|
![Аватар для Erolast](https://javascript.ru/forum/image.php?u=30674&dateline=1380548540) |
Профессор
|
|
Регистрация: 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.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 12:55
|
Кандидат Javascript-наук
|
|
Регистрация: 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
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 14:12
|
Кандидат Javascript-наук
|
|
Регистрация: 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()
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 14:45
|
![Аватар для Erolast](https://javascript.ru/forum/image.php?u=30674&dateline=1380548540) |
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Это ты не пизди, когда не знаешь.
Это не методы класса, это методы, присваемые инстансам класса при инициализации. При этом каждый новый инстанс будет иметь свою собственную пачку методов, что в большинстве случаев нецелесообразно и приводит к перерасходу памяти. Методы класса хранятся в прототипе.
Кстати, с каких это пор ты стал употреблять ; и var?
Последний раз редактировалось Erolast, 25.10.2014 в 14:48.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 14:50
|
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 14:52
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от Erolast
|
При этом каждый новый инстанс будет иметь свою собственную пачку методов, что в большинстве случаев нецелесообразно и приводит к перерасходу памяти
|
Это не имеет никакого отношения к делу. Как там быдло что называет, никого не волнует. С точки зрения работы кода, это именно то, о чем ты кукарекал. А свою жаба-терминологию держи при себе.
Сообщение от Erolast
|
к перерасходу памяти
|
Это можно легко решить, но я распинаться перед тобой не буду, один х не поймшь
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 14:59
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от Erolast
|
Кстати, с каких это пор ты стал употреблять ; и var?
|
Это паста была, я их не употребляю, там где не надо, в отличии от быдлятины, которая лепит их везде.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 15:03
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от Erolast
|
Кстати, с каких это пор ты стал употреблять ; и var?
|
Ты про какой, вообще кусок говоришь? Если про этот, http://javascript.ru/forum/showthrea...515#post337475, то там все по делу употреблено, ущерб, там без них код не отработает. Я что говорил, что нигде употреблять не надо? Разупорись.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 15:03
|
![Аватар для Erolast](https://javascript.ru/forum/image.php?u=30674&dateline=1380548540) |
Профессор
|
|
Регистрация: 24.09.2013
Сообщений: 1,436
|
|
Цитата:
|
Обсуждали уже в начале топика, ему надо чтобы изменение дочернего класса не влияло на Interface, идиот.
|
А при такой реализации оно и не будет влиять, идиот.
Цитата:
|
ты написал то же самое, только мудреным синтаксисом (чтоб никто не догадался опять?)
|
Нет, не то же.
Цитата:
|
Не лезь в треды, где мужики разговаривают, пиши жеквери, это самое твое.
Это не имеет никакого отношения к делу. Как там быдло что называет, никого не волнует. С точки зрения работы кода, это именно то, о чем ты кукарекал. А свою жаба-терминологию держи при себе.
Это можно легко решить, но я распинаться перед тобой не буду, один х не поймшь
|
А, я ж и забыл, что ты у нас мегакодер.
Последний раз редактировалось Erolast, 25.10.2014 в 15:08.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
25.10.2014, 15:12
|
Кандидат Javascript-наук
|
|
Регистрация: 14.10.2014
Сообщений: 117
|
|
Сообщение от Erolast
|
А при такой реализации оно и не будет влиять, идиот.
|
Ты мудило кнокпу run нажми хотя бы для приличия
|
|
|
|