2014-09-30 66 views
1

有一天,我正在擺弄Javascript,並且我注意到我不能在原型函數中將原型寫入對象。像這樣:Javascript嵌套原型

var obj = function() { } 

obj.prototype.First = function() { 
    this.prototype.Second = function() { 
     alert("Second Prototype"); 
    } 
} 

obj.First(); 
obj.Second(); 

出於某種原因,第二個原型將無法工作,代碼無法運行。我的語法是錯誤的還是有一些我不知道的原型限制?謝謝!

編輯:
我沒有試圖添加原型到原型......這沒有多大意義。這就是我想要做的:將兩個單獨的原型添加到obj。原型2是在調用原型1時定義的。我認爲this將包含對象的引用,因此this.prototype將與obj.prototype相同,但它不能按預期工作。

+0

爲什麼不直接使用'obj.prototype.Second = ...'? – 2014-09-30 00:12:52

+2

你正在混淆函數和實例。 – SLaks 2014-09-30 00:39:06

+0

'obj'是一個函數。 'obj.prototype'是函數的一個屬性,只有當你用'new'調用函數時纔會使用它。例如。 'var foo = new obj();'。 'foo.First'現在可用,因爲'obj.prototype'是'foo'的原型。然而,'obj.First'不能工作,因爲你從來沒有在'obj'上創建'First'屬性。 – 2014-09-30 20:53:03

回答

1

也許this可以幫助您理解構造函數和原型的作用。

取決於你想要做什麼(OBJ,第一和第二並沒有真正表現出你的意圖),你可以這樣做:

一個人的眼睛。這可以通過構圖完成。

僱主是一個人,但一個人不一定是僱主(也可以是客戶或顧問)。這可以通過繼承完成。

貓可以移動。在基於類的語言中,Cat必須實現Movable,但在JavaScript中,您可以使用mix並將實現留給Movable提供或覆蓋它的默認實現。 JavaScript不編譯時間檢查你是否執行某些事情。

如果您想在調用某個函數後更改對象實例的類型,那麼插入原型會很危險,因爲這會影響該類型的所有實例。

也許你應該返回另一個類型的實例。

var Customer = function(name) { 
    this.name=name || 'unknown'; 
}; 
Customer.createVipCustomer = function() { 
    return new VipCustomer(this); 
} 
var VipCustomer=function(customer){ 
    //re use Customer constructor 
    Customer.call(this,customer.name); 
    this.isVip=true; 
} 
//inherit the protype defined members 
VipCustomer.prototype=Object.create(Customer.prototype); 
VipCustomer.prototype.constructor=VipCustomer; 
VipCustomer.prototype.second=function(){ 
    console.log('this is second'); 
} 
var aCustomer = new Customer('Ben'); 
//update to VipCustomer 
aCustomer = Customer.createVipCustomer(aCustomer); 
aCustomer.second(); 
1

this.prototype不存在。

如果要將實體添加到實例,請使用this

如果要將屬性添加到原型,請使用Constructor.prototype

此外,obj是一個函數(類),不是一個實例,
您希望使用new關鍵字來創建一個實例,你應該命名構造函數爲UpperCamelCase。

+0

@ Blue0500我改變了我的答案。在審查你的問題時,你會希望實例在調用某個函數時改變類型。 – HMR 2014-09-30 03:17:24

1

這是一個古老的問題,但我想我會增加我的兩分錢。 此代碼試圖在'原型'上添加函數。但是,這隻能在類名上完成。你有什麼是一個指向匿名類的變量。要訪問匿名變量的變量,請使用'proto'。以下內容與您的示例相同,但使用原型它是'成功'的。雖然,我沒有看到使用這種原型的好處,因爲原型添加方法僅適用於匿名實例'obj'。http://jsbin.com/zapocamipi/edit?js,console

var obj = function() { } 

obj.__proto__.First = function() { 
    console.log("First Prototype"); 
    this.__proto__.Second = function() { 
     console.log(this); 
    } 
} 

obj.First(); 
obj.Second();