2013-11-29 71 views
-1

我有一個對象內部定義的一些功能:對象不繼承父對象的功能

var functions = { 
    __construct: function(){ 
     console.log(this); 
     this.prototype.__construct(); // <problem 
    } 
}; 

我這個合併的對象與另外一個,是一個函數(之後我創建函數的新實例):

var plugin = function(){}; 

plugin.prototype.__construct = function(){ 
    console.log('parent'); 
}; 

var i = new plugin(); 
i = $.extend({}, i, functions); 

但在那之後,當我試圖調用__construct功能:

i.__construct(); 

我得到這個錯誤:

Uncaught TypeError: Cannot call method '__construct' of undefined

這是因爲該行:

this.prototype.__construct(); 

我想看看我是否可以打電話從子構造父構造函數,但現在看來,該對象沒有原型?跆拳道?

+2

_「後,我創建函數的新實例」 _:

如果動態希望延長與構造函數創建一個實例,你可以做這樣的事情? – elclanrs

+0

因爲$ .extend返回一個簡單的對象,而不是一個函數,我不能調用一個簡單的對象 – Alex

+1

^可能是因爲OP使用'$ .extend'。這是一個非常荒謬的事情來投票的問題。我並不是說這個問題應該或不應該被低估,但不應該因爲添加該標籤而被低估。 – Vinay

回答

2

不知道你想在這裏做什麼,但我確實有一個__construct函數使用您提供的代碼時:

var functions = { 
     __construct: function(){ 
      console.log(this); 
      this.prototype.__construct(); // <problem 
     } 
     }; 
var plugin = function(){};  
plugin.prototype.__construct = function(){ 
    console.log('parent'); 
}; 
var i = new plugin(); 
i = $.extend({}, i, functions); 
console.log(i.__construct===functions.__construct);//true 
console.log(i.__construct===plugin.prototype.__construct);//false 

不知道你在想什麼this.prototype將是,也許this answer將清除原型用於什麼(共享成員)和什麼this意味着(具體實例)。您可以將原型中定義的共享成員進一步映射到原型鏈或實例中,但這不是您在此處所做的。爲什麼之後 -

var functions = { 
    __construct: function(){ 
     this.constructor.prototype.__construct.call(this); 
    } 
}; 

var Plugin = function(){}; 
Plugin.prototype.__construct = function(){ 
    console.log('parent'); 
}; 

var i = new Plugin(); 
i = $.extend(i,functions); 
i.__construct(); 
+0

同樣的錯誤:http://jsfiddle.net/H9yuX/ – Alex

+0

我明白,每個對象將共享從原型的東西,但我不能從'this.prototype'訪問它們:| – Alex

+0

@Alex對象實例沒有原型,函數有原型。如果使用構造函數創建對象實例,那麼當您請求直接在實例上找不到的成員時,構造函數的原型將成爲原型鏈中使用的第一個原型。您無法從實例訪問實例原型,因爲該實例沒有原型。關於構造函數和原型的介紹也將解釋這一點。 – HMR