這不起作用,因爲你是覆蓋的原型。當您撥打new Outer
時,this
將繼承目前的Outer.prototype
。然後,您在函數內重寫Object.prototype
,但它不會影響當前創建的實例,只會影響未來的實例。
你必須擴展現有的原型。
但是如果你想隱藏某些功能,使用自調用函數:
var Outer = (function() {
function Extensions() {
}
Extensions.protoype.Greet = function() {
alert(this.Greetings);
}
function Inner() {
Extensions.call(this);
this.Greetings = "Take me to your leader.";
}
Inner.prototype = Object.create(Extensions.prototype);
Inner.prototype.constructor = Inner;
function Outer() {
Extensions.call(this);
this.Greetings = "Greetings!";
}
Outer.prototype = Object.create(Extensions.prototype);
Outer.prototype.constructor = Outer;
Outer.prototype.getInner = function() {
return new Inner();
};
return Outer;
}());
這裏,Extensions
是立即執行函數中定義。因此它不能從外部訪問。自從您從該函數返回後,只能訪問Outer
。
請參閱this answer瞭解JavaScript中正確執行的繼承。
很酷。 「Inner」功能呢? 'Extensions.Greet'函數也必須能夠在'Inner'對象上調用。 –
你可以用完全相同的方法來完成。在閉包中定義它並從'getInner'方法返回一個新實例。 –
你可以添加到代碼,所以我可以看到它?在我的腦海中看到它有點難。特別是因爲我仍然在努力嘲諷像'call'這樣的花哨的東西。 –