2013-11-29 69 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