变成原型看起来像:
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");
现在,如果我想为它们添加一个新功能。使用对象文字方法,那么您必须记住还将它添加到 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,所以有很多有趣的事情
您可以处理对象文字无法处理的关系。
您可以将原型视为创建对象的小型工厂
而不必自己创建每个对象作为文字。
现在,如果你在想,“好吧,我只想要一个
这些,我不会做任何你疯狂的方法
扩展魔法。”然后定义一个对象字面量是一个完全有效的方法
对于一些问题。有时使用原型会更好。使用
对您要解决的问题有意义的模式,
而不是试图将您的问题融入一种模式。