2011-08-23 104 views
9

我通常在我的项目中以这种方式创建我的类......对象字面量。JavaScript原型解释需要

var objectName = { 

    //global variables 
     a : 'somevalue', 

     func1: function(){ 

     }, 


     func2: function(){ 

     } 

} 

如果我必须把它变成原型格式,我该怎么做?

使用原型的优势是什么,而不是使用这种格式的作业。

为什么人们在原型上说得太多了。

回答

32

化作原型看起来像:

var someObject = function() { 
    this.a = "somevalue"; 
}; 

someObject.prototype.func1 = function() { // work }; 
someObject.prototype.func2 = function() { // work }; 

var myObject = new someObject(); 

有哪些优势?好吧,有一堆,但有 是少数真正的实际原因,当原型使 比对象文字更有意义。

首先是减少重复代码;所以,可以说你想 另一个对象很熟悉objectName,但你想要a到 是一个不同的值。你可能最终会是这样的:

var objectName = { 
     a : 'somevalue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

var otherObjectName = { 
     a : 'otherValue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

而且你可以说

var objectName = { 
     a : 'somevalue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

var otherObjectName = { 
     a : 'otherValue', 
     func1: objectName.func1, 
     func2: objectName.func2 
} 

或者,使用原型减少重复的功能,我可以让这样我就可以在价值传递在建造物体期间我想要a。重构代码看起来像这样:

var someObject = function(a) { 
    this.a = a; 
}; 

someObject.prototype.func1 = function() { /* work */ }; 
someObject.prototype.func2 = function() { /* work */ }; 

var myObject = new someObject("somevalue"); 
var myOtherObject = new someObject("otherValue"); 

现在,如果我想添加一个新的功能,他们两个。使用对象字面apporach,那么你将不得不记得也将其添加到otherObjectName。随着文字数量的增加,管理它们需要花费更长时间和更多的难度。

使用原型方法,所有我们不得不说的是:

someObject.prototype.func3 = function() { // do even more work } 

或更有趣,我可以动态地仅 说有一个参考延长两个对象。

// find what function made me, get its prototype, and add a new function to it 
myObject.constructor.prototype.func3 = function() { /* work */ } 
myOtherObject.func3() // tada magic! 

或我可以做一个新的对象,只知道一个参考。像:

var newObject = myObject.constructor(myObject.a + " new"); 

因为无论myObjectmyOtherObject共享相同constructorprototype,也有很多有趣的事情 你可以用这种关系,你不能使用对象文本做做。

您可以将原型想象成小工厂来创建对象 ,而不必将每个对象都创建为字面值。

现在,如果你在想,“呃,我只会有一个 这些,我不会去做你的任何疯狂的方法 扩展魔术。“然后定义一个对象文字是一个完全有效的应用程序 对于一些问题。有时使用原型更好。使用 模式是有意义的,您正试图解决的问题, ,而不是试图将您的问题,以适应

+0

非常好的解释...谢谢 – Anshul

+0

我没有得到它:( –

+0

那么定义函数在构造函数中和定义它在原型之间有什么区别或优点:constructor.prototype.func = function( ){}; –