LINUX.ORG.RU

JS. Прототипы. Сага вторая.

 


0

1

После своей последней имплементации объектов JS, на самом JS, вдруг внезапно осенило. А ведь «родитель» объекта, мля, есть ни что иное, как «ссылка» этого же ребенка на своего родителя. Т.е. по сути, ничем не отличается от обычного свойства, этого самого ребенка.

В следующем коде, все 4 «вызова» объекта d семантически эквивалентны, а последние 2 - полностью эквивалентны.


a={one: 1}
b={two: 2}
c={three: 3}

d={proto1: a, proto2: b, __proto__: c}

d.proto1.one
d.proto2.two
d.__proto__.three
d.three

1
2
3
3

Тада, спрашивается, нафига весь этот шум: делать св-во __proto__ явным или скрытым? Какое это вообще имеет значение? Да никакого, кроме сахара. Любое св-во объекта, можно трактовать, как его родитель.

var A = function(){}
A.prototype.a = 1
A.prototype.getA = function(){ return this.a }
var a = new A
a.a = 2
a.getA() //2
a.constructor.prototype.getA() //1

А в чем собственно вопрос?

пс
На каком языке ты писал до этого?

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Ответ на: комментарий от special-k

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

anonimous
() автор топика
Ответ на: комментарий от anonymous

Да какая разница, его нет явно, а так - одна хрень. Ненужно (имхо).

anonimous
() автор топика
Ответ на: комментарий от anonymous

Правильный способ получить прототип

a={one: 1}
b={proto: a}

gpo=function(ob){return ob.proto}
gpo(b)
{ one: 1 }

Не воно?:)

anonimous
() автор топика
Ответ на: комментарий от anonymous

Он есть в реализации

По-мойму, вся эта система представляет из себя что-то вроде этого

gproto=function(){return this.proto}
pob={one: 1}
ob={gproto: gproto, proto: pob}

ob.gproto()// { one: 1 }

А вот так можно создавать почти нативные объекты, все они будут содержать уже готовый к употреблению метод:

gproto=function(){return this.proto}
mkOb=function(name, val){var ob={gproto: gproto}; ob[name]=val; return ob}
pob={one: 1}
ob=mkOb("proto", pob)

ob.gproto() // { one: 1 }
anonimous
() автор топика

Весь ООП и ФП и прочие парадигмы, есть не более чем синтаксический сахар, но видя этот сахар както думается легче, не надо заботиться о написании кучи кода и диких конструкций, пусть компелятор\парсер сам всё необходимое подставляет.

mm3 ★★★
()
Ответ на: комментарий от anonimous

Можно сделать обертку из функции, которая будет сразу возвращать объект, со ссылкой на прото.

Жуткая каша в голове у тебя.

Ну не используй прототипы, делай типа

var A = function(a,b,c){
  return {
    a: a,
    b: b,
    c: c,
    d: 4,
    e: function(){ return this.a + this.b }
  }
}
var a = A(1,2,3)
a.e() //3
Если не знаешь как использовать - не обязательно орать про какой-то сахар..

special-k ★★★★
()
Ответ на: комментарий от special-k

А что вы, собственно, тут показали? Я говорил об организации наследования по цепочкам прототипов, а вы показали банальщину - фабрику объектов.

anonimous
() автор топика
Ответ на: комментарий от anonimous

наследования по цепочкам прототипов

так вот что это было..

Тада, спрашивается, нафига весь этот шум: делать св-во __proto__ явным или скрытым?

Ты не будешь всегда знать где именно хранится свойство/метод.

special-k ★★★★
()
Последнее исправление: special-k (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.