代码之家  ›  专栏  ›  技术社区  ›  Rixius

经典结构比原型结构有什么好处?

  •  4
  • Rixius  · 技术社区  · 16 年前

    我最近才开始编程,而且完全自学,不幸的是我没有详细的计算机科学课程的好处。最近我读了很多关于JavaScript的文章,我试图从类中找到JavaScript原型的好处。问题似乎被拉到中间哪一个更好,我想看看经典的一面。

    var inst_a = {
      "X": 123,
      "Y": 321,
      add: function () {
        return this.X+this.Y;
      }
    };
    document.write(inst_a.add());
    

    然后是古典版本

    function A(x,y){
      this.X = x;
      this.Y = y;
      this.add = function(){
        return this.X+this.Y;
      };
    };
    var inst_a = new A(123,321);
    document.write(inst_a.add());
    

    5 回复  |  直到 16 年前
        1
  •  3
  •   Hooray Im Helping codaddict    16 年前

    如果不使用古典风格,继承是不可能的。看看道格拉斯·克罗克福德要做什么 say 关于它。即使要使用纯原型对象结构,也必须为继承创建构造函数(Crockford就是这样做的,然后将其抽象到 create 方法将其称为纯原型)

        2
  •  3
  •   Mark Bolusmjak    16 年前

    通过创建对象时 new ,它将使用它的原型链来查找实例中找不到的属性。

    例如,您可以添加 add 方法 A.prototype A .

    function A(x,y){
      this.X = x;
      this.Y = y;
    
    };
    //define add once, instead of every time we create a new 'A'
    A.prototype.add = function(){
        return this.X+this.Y;
      };
    
        3
  •  2
  •   Josh Andreas Rehm    16 年前

    A

    var inst_one = new A(123,321);
    var inst_two = new A(456,654);
    
    // some meaningful code here...
    document.write(inst_one.add());
    
    
    // some more meaningful code here...
    document.write(inst_two.add());
    

    您提供的示例并不重要,因此让我们来创建一个更直观的示例:

    function Comment(user,text){
      this.user = user;
      this.text = text;
      this.toString = function(){
        return '<span class="comment">'+this.text+' - <a class="user">'+this.user+'</a></span>';
      };
    };
    
    
    var comments = someFunctionThatReturnsALotOfCommentObjects();
    for(c=0;c<comments.length;c++)
      document.getElementById('comments_container').innerHTML += comments[c].toString();
    

    Object Oriented Programming 概念,这可能是为什么你不熟悉它,如果你没有正式的编程课程。

        4
  •  1
  •   Bob    16 年前

    这里的功能不同,只是形式不同:

    class someObj
    {
        private int x;
        public int returnX()
        {
            return x;
        }
    }
    someObj temp = new someObj();
    

    -

    function someObj {
        var x;
        this.returnX = function() {
            return x;
        };
    }
    var temp = new someObj();
    

    原型在遗传上确实不同。在原型继承中,创建新对象实际上是复制原型对象的实例,然后向其添加新字段或成员。另一方面,经典继承并不是处理一个实例,而是处理一个“蓝图”。例如,在JavaScript中,您会说:

    temp.prototype = new someOtherObj(); //Creating a new instance to serve as the prototype.
    

    用古典语言你可能会说:

    class someObj : someOtherObj //Copying the "blue print" over.
    

    这意味着数据将在原型语言的派生对象之间共享。我曾经写过一个函数,并通过JavaScript原型从中派生出另一个函数。这个基本对象持有对DOM对象的引用,当我在一个子对象中更改它时,它将更改该子对象的所有实例的引用。这是因为,同样,在原型语言中,您是从实例派生的,而不是“蓝图”。

        5
  •  0
  •   Alessandro Baldoni    16 年前

    经典版本允许您在对象的“内部”声明私有变量,而原型版本则不允许。