需要JavaScript原型解释

需要JavaScript原型解释,javascript,prototype-programming,Javascript,Prototype Programming,我通常在我的项目中以这种方式创建我的类。。。对象文字 var objectName = { //global variables a : 'somevalue', func1: function(){ }, func2: function(){ } } 如果我必须将其转换为原型格式,我将如何做 当使用这种格式完成工作时,使用prototype还有什么比这更大的优势呢 为什么人们会对原型说这么多。变成原型看起来像

我通常在我的项目中以这种方式创建我的类。。。对象文字

var objectName = {

     //global variables
      a : 'somevalue',

      func1: function(){

      },


      func2: function(){

      }

}
如果我必须将其转换为原型格式,我将如何做

当使用这种格式完成工作时,使用prototype还有什么比这更大的优势呢


为什么人们会对原型说这么多。

变成原型看起来像:

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

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

var myObject = new someObject();
var objectName = {
      a : 'somevalue',
      func1: function(){ },
      func2: function(){ }
}

var otherObjectName = {
      a : 'otherValue',
      func1: function(){ },
      func2: function(){ }
}
有什么好处?嗯,有很多,但是有 原型制作时有几个真正实用的理由吗 比对象文字更有意义

首先是减少重复代码;那么,假设你想要 另一个对象非常类似于
objectName
,但您希望
a
这是一个不同的价值观。您可能会得到以下结果:

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

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

var myObject = new someObject();
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");
现在,如果我想给它们都添加一个新函数。使用object-literal-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.func=function(){};您不需要在“var newObject=myObject.constructor(myObject.a+“new”);”行中使用“new”?这仍然会触发实例化新对象的类似工厂的操作?