经典与原型......它们如何如此不同?

时间:2009-11-28 03:09:47

标签: javascript inheritance prototype object class

例如在PHP中

class foo{
  function foo($name){ //constructor
    $this->name=$name;
  }
  function sayMyName(){
     return $this->name;
  }
}
class bar extends foo{
  function sayMyName(){
     return "subclassed ".$this->name;
  }
}

在JS中

function foo(name){
  this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};

function bar(){}

bar.prototype=new foo();
bar.prototype.sayMyName=function(){return "subclassed "+this.name};

我是javascript的新手,所以请赐教,不是它们功能相同,还是我错过了一些巨大的东西?
如果它们是相同的,那么经典与原型有何不同?

提前感谢...

4 个答案:

答案 0 :(得分:6)

在JavaScript中,您可以在程序运行时更改继承,这是您在经典编程中无法做到的。例如:

function foo(name){
  this.name=name;
}
foo.prototype.sayMyName=function(){return this.name};

function foo2(name){
  this.name = name;
}
foo2.prototype.sayMyName = function(){return "My name is "+this.name;};

function bar(){}

bar.prototype = new foo();
var myBar = new bar();
myBar.name = "Marius";
alert(myBar.sayMyName());

bar.prototype = new foo2();
var myBar2 = new bar();
myBar2.name = "Marius";
alert(myBar2.sayMyName());

答案 1 :(得分:2)

JavaScript(正如您指出的那样)使用prototype based的特定类型的OOP。在JavaScript中,您不创建类,只需克隆现有对象并通过向其原型添加成员来扩充它们。

在PHP中,您创建的类是新对象的蓝图。

答案 2 :(得分:2)

我向安德鲁·黑尔和马吕斯保证。通过在运行时修改类,可以改变类的功能。经典OOP不允许您这样做,您必须准确指定类/对象可以执行的操作以及在编译之前或解释之前它具有的数据属性(如果是解释语言)。

您提供的代码在功能上是相同的,但这只是因为您没有利用JS中的原型。

答案 3 :(得分:0)

基于类的继承

  • 类和实例是截然不同的 实体即可。
  • 使用类定义定义类;使用构造方法实例化一个类
  • 使用new运算符创建单个对象。
  • 使用类定义构建对象层次结构以定义现有类的子类。
  • 按照类链继承属性。
  • 类定义指定类的所有实例的所有属性。 无法在运行时动态添加属性

基于原型的继承

  • 所有对象都是实例
  • 使用构造函数定义和创建一组对象。
  • 使用new运算符创建单个对象。
  • 通过将对象指定为与构造函数关联的原型来构造对象层次结构。
  • 按照原型链继承属性。
  • 构造函数或原型指定一组初始属性。 可以动态添加或删除属性到单个对象或整个对象集。