【问题标题】:JavaScript Prototype explanation needed需要 JavaScript 原型解释
【发布时间】:2011-11-01 21:13:09
【问题描述】:

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

var objectName = {

     //global variables
      a : 'somevalue',

      func1: function(){

      },


      func2: function(){

      }

}

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

当使用这种格式完成工作时,使用原型比这个有什么优势。

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

【问题讨论】:

    标签: javascript prototype-programming


    【解决方案1】:

    变成原型看起来像:

    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");
    

    因为myObjectmyOtherObject共享相同的constructorprototype,所以有很多有趣的事情 您可以处理对象文字无法处理的关系。

    您可以将原型视为创建对象的小型工厂 而不必自己创建每个对象作为文字。

    现在,如果你在想,“好吧,我只想要一个 这些,我不会做任何你疯狂的方法 扩展魔法。”然后定义一个对象字面量是一个完全有效的方法 对于一些问题。有时使用原型会更好。使用 对您要解决的问题有意义的模式, 而不是试图将您的问题融入一种模式。

    【讨论】:

    • 那么在构造函数中定义函数和在原型中定义函数之间有什么区别或优势:constructor.prototype.func = function () {};
    • 你不需要在 "var newObject = myObject.constructor(myObject.a + "new");" 行中添加一个 "new" 吗?这仍然会触发实例化新对象的类似工厂的操作吗?
    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多