@Cepega

This прототипа. Как его получить?

A.prototype =
{
    subO:
    {
        f: function ()
        {
            this // Вернёт subO
            // А как получить  this прототипа?
        }
    }
};
  • Вопрос задан
  • 2390 просмотров
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Никак. Вложенные объекты просто останутся вложенными объектами, по сути вы объявили контейнер для статических переменных.
function MyObject() {
}

MyObject.prototype = {
    sub: {},
}

var a = new MyObject(),
      b = new MyObject();

a.sub.test = 'foo';
b.sub.test === 'foo';


Собственно именно по этому инициализацию данных следует выполнять в конструкторе.
Ответ написан
Комментировать
Можно, конечно, поизвращаться с геттерами / сеттерами из ES5

function A(){}
var subO = {
  f: function(){
    return this.that;
  }
}
A.prototype = {
  get subO(){
    var P = Object.create(subO);
    P.that = this;
    return P;
  }
}

var inst = new A;
inst.subO.f() === inst; // true

или прокси из ES6, но проще и оптимальней привязать контекст в конструкторе:

function A(){
  this.subO = {
    f: function(){
      return this;
    }.bind(this)
  }
}
var inst = new A;
inst.subO.f() === inst; // true
Ответ написан
Комментировать
@IoannGrozny
Front-end разработчик
Строго говоря, ещё можно напрямую передать контекст уже в функцию, заставив её обрабатывать именно this конкретно нужного вам объекта:
// объект прототип;
var A = {
    x: 10,
    f: function() {
         console.log(this.x);
    }
}
// наследник;
var sub0 = Object.create(A); // A - прототип для sub0;
// переопределяем;
sub0.x=20;
// магия JS =)
sub0.f()  // 20

sub0.f.apply(A) // вызов в контексте прототипа, возвращает 10;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы