2014-07-09 34 views
0

我正在和一位同事討論Javascript OO策略/模式,並且從我讀過的大多數教程中討論了建立原型/繼承關係的常用方法兩個構造函數(帶參數)是將一個原型分配給子函數。JavaScript繼承:在構造函數中使用__proto__而不是構造函數的prototype屬性

例如:

var MyParentClass = function(arg1) { ... }; 

var MyChildClass = function(arg1, arg2) { 
    MyParentClass.apply(this, arguments); 
    ... 
}; 
MyChildClass.prototype = new MyParentClass; 

這裏的一個問題是,該參數可能是不同的順序,或者改變名稱等,且上文的實例確實需要兩(2)單獨的語句來建立關係(apply()語句和.prototype statemetn)。

我的同事建議這種方法代替:

var MyParentClass = function(arg1) { ... }; 

var MyChildClass = function(arg1, arg2) { 
    this.__proto__ = new MyParentClass(arg2); 
    ... 
}; 

這種方法是短,提供了更多的靈活性,朝向參數傳遞給parent constructor

除非我遺漏了一些東西,似乎這應該是建立JavaScript類之間繼承關係的事實上的模式,所以我很好奇爲什麼我從來沒有在所有JavaScript OO教程中遇到過這種模式遠。任何人都可以讓我知道,如果上述策略有任何缺點?

+3

因爲'__proto__'是非標準的,過時,不應該使用。 – elclanrs

+0

也因爲你在每個實例上分別設置'__proto__',所以'instance1 .__ proto__!== instance2 .__ proto__'。 –

+0

@JamesAllardice在這種情況下,它是所需的行爲,如果我是正確的,我們不希望兩個實例指向相同的原型實例。例如,如果Parent是Person,Child是Employee,我們希望每個Employee的原型對象也是一個單獨的Person實例。然而,我誤解了什麼? – hbCyber

回答

3

可以按如下方式處理與傳遞參數給家長constructor-功能的問題:

而不是

MyChildClass.prototype = new MyParentClass; 

你可以這樣,你可以寫

MyChildClass.prototype = Object.create(MyParentClass.protoype) 

分配原型而沒有MyParentClass的新實例化

如果你想從MyChildClass的constructorFunction參數傳遞給MyParentClass你可以做這樣的:

function MyChildClass(arg1) { 
    MyParentClass.call(this, arg1); 
}