函數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'。構造函數調用與方法調用非常不同,因爲它們不會接收對方法目標的引用。 – 2013-03-10 19:55:53
這就是爲什麼我問。任何黑客得到「a」的參考? – 2013-03-10 20:05:32
你可以讓'b'返回一個綁定curry的getter屬性。 – 2013-03-10 22:31:17