经典结构相对于原型结构有什么好处?

时间:2010-05-21 15:25:34

标签: javascript class computer-science prototype

我最近才开始编程,并且完全是自学成才,遗憾的是,我没有详细的计算机科学课程的好处。我最近一直在阅读很多关于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());

我开始考虑这个因为我正在查看新的ecmascript修订版5并且很多人似乎并没有添加类系统。

5 个答案:

答案 0 :(得分:3)

当您通过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;
  };

答案 1 :(得分:3)

如果不使用psuedoclassical样式,实际上不可能继承。看看道格拉斯·克罗克福德对say有什么看法。即使您要使用纯粹的原型对象结构,您也必须创建一个构造函数来继承(Crockford会这样做,然后在create方法后面抽象它然后将其称为纯粹的原型)

答案 2 :(得分:2)

使用第二种方法,您可以创建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();

这(希望)证明了能够创建类的多个实例的好处。这不是一个基本的JavaScript概念,它是一个基本的Object Oriented Programming概念,如果您没有正式的编程课程,这可能就是您不熟悉它的原因。

答案 3 :(得分:1)

公平地说,JavaScript 有类。好吧,也许有些人会争辩,但我认为这只是头发的语义分裂。如果一个类被认为是用于创建对象的蓝图,那么JavaScript函数可以以该容量服务。这里的函数没有很多的区别,只有形式:

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对象的引用,当我在一个子对象中更改它时,它将为该子对象的所有实例更改它。这是因为,在原型语言中,您是从实例派生而不是“蓝图”。

答案 4 :(得分:0)

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