2009-06-19 32 views
0

什么用构造函数像这样的好处是:在JavaScript对象中使用构造函数的优点是什么?

var MyLibrary = new function(){ 
    var self = this; 
    self.MyLibrary = function(){ 
     // init code 
    } 

} 

不是简单对象内部编写代码?

var MyLibrary = new function(){ 
    // init code 
} 
+1

甚至可以在第一种情况下运行init代码吗?看起来你不是在调用这个函数(不管那是什么)。它不像通常在javascript中做的那样是传统的“构造函数”。 – Kekoa 2009-06-19 07:04:21

回答

3

这些都不是很正确,虽然第二个可能工作,但不是真正的对象,更像是一个单身(但以一种奇怪的方式)。这里是一个构造函数的类的实例:

// Class & Constructor definition 
function Rectangle(w,h) { 
    this.width = w; 
    this.height = h; 
} 

// Now your class methods go on the prototype object 
Rectangle.prototype.area = function() { 
    return this.width * this.height; 
} 

我们使用这个类:

var myRect = new Rectangle(3,4); 
myRect.area(); 

您也可以使用匿名函数保存“构造”的变种,而不是定义一个类命名函数:

// Class & Constructor definition 
var Rectangle = function(w,h) { 
    this.width = w; 
    this.height = h; 
} 

// Now your class methods go on the prototype object 
Rectangle.prototype.area = function() { 
    return this.width * this.height; 
} 
3

好吧,如果你使用原型继承来创建新的类,你会做这样的事情:

function MyBaseClass() { 
    // common stuff here 
} 

function MySubClass() { 
    // subclass-specific stuff here 
} 

MySubClass.prototype = new MyBaseClass(); 

最后一行需要建立继承链。但是,它也有执行MyBaseClass主体的副作用,这可能会导致问题(特别是如果MyBaseClass函数需要参数)。

如果你不希望这样的事情发生,做这样的事情:

function MyBaseClass() { 
    this.init = function() { 
     // initialisation stuff here 
    } 
    // common stuff here 
} 

function MySubClass() { 
    // subclass-specific stuff here 
    this.init(); 
} 

MySubClass.prototype = new MyBaseClass(); 

init的初始化代码,当你创建的MySubClass一个实例现在只能执行。

+0

不要使用实例进行原型继承。如果可用,请使用Object.create – aehlke 2010-08-11 21:00:00

+0

对象的原型必须是实例。 – harto 2010-08-13 03:54:14

相关问题