我通常在我的项目中以这种方式创建我的类...对象文字。
var objectName = {
//global variables
a : 'somevalue',
func1: function(){
},
func2: function(){
}
}
如果我必须将其转换为原型格式,我该怎么做?
当使用这种格式完成工作时,使用原型比使用原型更有利。
为什么人们在原型上说得太多。
答案 0 :(得分: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");
因为myObject
和myOtherObject
共享相同的constructor
和prototype
,所以有很多有趣的事情
你可以用那种你不能用对象文字做的关系来做。
您可以将原型视为创建对象的小工厂 而不是必须自己创建每个对象作为文字。
现在,如果你在想,“好吧,我只会有一个 其中,我不会做任何你疯狂的方法 扩展魔法。“然后定义一个对象文字是一个完全有效的apporach 对于一些问题。有时使用原型更好。使用 对你试图解决的问题有意义的模式, 而不是试图让你的问题适应模式。