2016-01-25 57 views
1

我有一个View类有一个构造方法initialize我认为这是一个构造方法,纠正我,如果错了。Javascript如何重写构造方法?

var View = function(obj) { 
    this.initalize = obj.initalize; 
}; 

我想实现的是当类被实例化时被调用的东西。

我该如何传递一个对象?

var chatView = new View({ 
    initialize: function() { 
     alert('Yay for initialization'); 
    } 
}); 

这样当我实例化View我可以将对象传递给构造函数和中的一个关键initialize哪个值的函数,并且实例化时该键具体被调用。

+1

[为什么不可能改变构造的可能的复制函数原型?](http://stackoverflow.com/questions/9267157/why-is-it-impossible-to-change-constructor-function-from-prototype) – AMACB

+1

'obj.initalize()'? – Oriol

+0

*我想实现的是在类实例化时调用的东西。*然后调用它。 –

回答

2

如果我得到它的权利,有获得你想要的东西的简单方法:

var View = function(obj) { 
    obj.initialize(); 
} 

这样,当你创建一个视图类初始化函数被调用。

请注意,如果你想要做真正的“初始化代码”初始化函数内的工作,你可以使用call(或apply):

var View = function(obj) { 
    if (typeof obj.initialize === 'function') { 
     obj.initialize.call(this); 
    } 
} 

var chatView = new View({ 
    initialize: function() { 
     this.property = 'property'; 
    } 
}); 

console.log(chatView.property); // outputs property 
+0

似乎合法,让我试试看。我注意到backbone.js和'call()'类似。我需要调查它做了什么。 –

+0

甜美的男人谢谢。我应该知道什么使用这个?为什么'_.extend()'会给我带来好处? –

+1

我不是_库的用户,但我会说,如果你真的想要使用这个“自定义初始化”的概念,你可以在调用它之前检查'obj'中'initialize'方法的可用性, 'View'类更健壮(我将进行编辑)。 – Samuel

0

Javascript没有构造函数,请记住javascript基于原型。这是“构造”的一个例子,你可以创建

function Example (firstname, lastname) { 
this.firstname = firstname; 
this.lastname = lastname; 
} 

Example.prototype.getFullname = function() { 
return this.firstname + ' ' + this.lastname; 
} 

如果你想创建一个构造函数,你必须调用它实例化功能之后。

但是,这是一个更好的结构,你可以使用。我只推荐你需要构造函数和私有函数。否则,用原型声明的方法使用简单的结构,可以获得更好的性能。

var MyObject = (function() { 

    // Constructor 
    function MyObject (foo) { 
     this._foo = foo; 
    } 

    function privateFun (prefix) { 
     return prefix + this._foo; 
    } 

    MyObject.prototype.publicFun = function() { 
     return privateFun.call(this, '>>'); 
    } 

    return MyObject; 
})(); 


var myObject = new MyObject('bar'); 

有了这段代码,你有一个构造函数,但它是一个“私有”函数,所以在实例化对象后你不能覆盖它。

在这里,我有一个链接,我创建测试型动物结构: https://plnkr.co/edit/qzgWVZlnIFnWl0MoUe5n?p=preview

结果:

测试1:〜15K(私人功能) - 仅建议,如果你想/需要一个私人函数

测试2:〜38k(带私有函数) - 不推荐,它返回一个非常糟糕的对象。

测试3:〜8K(没有私有函数) - 推荐,它具有最佳的性能,但是你不能创建一个私有函数,这意味着,任何人都可以调用任何功能:S