[英]JavaScript Prototype explanation needed
我通常在项目中以这种方式创建类...对象文字。
var objectName = {
//global variables
a : 'somevalue',
func1: function(){
},
func2: function(){
}
}
如果必须将其转换为原型格式,该怎么办?
当使用这种格式完成工作时,使用原型比使用原型有什么优势?
人们为什么对原型这么讲。
变成原型看起来像:
var someObject = function() {
this.a = "somevalue";
};
someObject.prototype.func1 = function() { // work };
someObject.prototype.func2 = function() { // work };
var myObject = new someObject();
有哪些优势? 好了,有很多,但是当原型比对象字面量更具意义时,有一些实际的实际原因。
首先是减少重复代码; 因此,可以说你想另一个对象非常smiliar到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
,所以使用该关系可以执行很多有趣的事情,而对于对象常量则无法做到。
您可以将原型想像成创建对象的小工厂,而不必自己像文字一样创建每个对象。
现在,如果您在想,“好吧,我只会使用其中之一,而不会使用任何疯狂的方法来扩展魔术。” 然后,定义对象文字是解决某些问题的完全有效的方法。 有时使用原型会更好。 使用对您要解决的问题有意义的模式,而不是尝试使问题适合模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.