Функция used as a constructor имеет только ссылку на новый экземпляр, унаследовав от своего прототипа.
Для того, чтобы это сохранить ссылку на оригинальный A
Например, вам нужно будет поставить B
конструктор в затворе:
function A() {
var that = this;
this.pa = { x: 1 };
this.B = function() {
this.pb = that.pa;
};
};
var a = new A();
var b = new a.B();
console.log (b.pb.x); // does print 1
a.pa.x = 2;
console.log (b.pb.x); // does print 2
Однако это имеет тот недостаток, что создание нового B
конструктора (с его собственный объект-прототип) для каждого экземпляра A
. Лучше бы что-то вроде
function A() {
this.pa = { x: 1 };
}
A.B = function() {
this.pb = null;
};
A.prototype.makeB = function() {
var b = new A.B();
b.pb = this.pa;
return b;
};
// you can modify the common A.B.prototype as well
var a = new A();
var b = a.makeB();
console.log (b.pb.x); // does print 1
a.pa.x = 2;
console.log (b.pb.x); // does print 2
Тем не менее, мы могли бы смешивать эти два подхода, так что у вас есть только один прототип, но различные конструкторы:
function A() {
var that = this;
this.pa = { x: 1 };
this.B = function() {
this.pb = that.pa;
};
this.B.prototype = A.Bproto;
}
A.Bproto = {
…
};
'новый aB' не создает связь между новым экземпляром 'A.prototype.B' и' a'. Конструкторские вызовы очень отличаются от вызовов методов тем, что они не получают ссылку на цель метода. –
Вот почему я спрашиваю. Любой взлом, чтобы получить ссылку на 'a'? –
Вы можете создать свойство 'b' getter, которое возвращает связанную валюту. –