在我学习Javascript的原型对象时,我总是不自觉地拿Java的类思想来做比较,时间久了,我渐渐认识到二者有巨大的不同。

首先,类是不能直接当方法来运行,它最简便的方式是调用其静态方法;而原型对象本身就是一个方法体,它可以直接运行。二者在构造对象的过程中,js可以扮演两种角色,一个可以将原型对象当方法来使用,才接触js时,都是以这种形式来使用,即万物皆方法体,像c;另一个是模仿面向对象的特性,为原型对象定义属性,运用构造器时,将构造器构造的对象的指针指通过原型链指向原型对象的属性,从而实现面向对象编程的形式。其实,做个有趣的实验,定义一个原型对象,为其定义一些属性,也为其定义可自动执行的部分代码,如:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<script type="text/javascript">
   function  test(){
    //定义两个属性
    this.pro1="属性1";
    this.pro2="属性2";

    //再定义部分可自动执行的代码
    alert("原型对象中代码被执行了!");

   }
   test();  //当方法体来用,可以执行内部代码,但属性无法访问

   alert(new test().pro1); //方法体在构造时内部代码执行了一遍,并且实例对象通过原型链的生成可以访问其中属性

</script>

</body>
</html>

  而这点,允许混杂的现象在Java类中一般是不被允许的(除非添加静态方法块或者main()方法入口),这也可以体现为什么js是基于对象,而不能被称为绝对规范的完全面向对象,与其说js“模仿”了面向对象的使用思想,我更倾向于说它是借用了面向对象的思想。如果一种新的优秀的编程思想被创造出来,js一样能凭借它的灵活模仿出来,而那些强类型的编程语言很可能就只能。。。。。。