JavaScript 定义类或对象

来源:互联网 发布:unity3d 场景 编辑:程序博客网 时间:2024/05/11 16:14

如果在搜索引擎搜JavaScript自定义类的内容,一大堆的无用信息。很多都是到处抄代码,一问就是贴了一篇源代码,说的又不准确。还是老实的看在线文档,推荐w3School.

动态原型方法

对于习惯使用其他语言的开发者来说,使用混合的构造函数/原型方式感觉不那么和谐。毕竟,定义类时,大多数面向对象语言都对属性和方法进行了视觉上的封装。请考虑下面的 Java 类:

class Car {  public String color = "blue";  public int doors = 4;  public int mpg = 25;  public Car(String color, int doors, int mpg) {    this.color = color;    this.doors = doors;    this.mpg = mpg;  }  public void showColor() {    System.out.println(color);  }}

Java 很好地打包了 Car 类的所有属性和方法,因此看见这段代码就知道它要实现什么功能,它定义了一个对象的信息。批评混合的构造函数/原型方式的人认为,在构造函数内部找属性,在其外部找方法的做法不合逻辑。因此,他们设计了动态原型方法,以提供更友好的编码风格。

动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。下面是用动态原型方法重写的 Car 类:

function Car(sColor,iDoors,iMpg) {  this.color = sColor;  this.doors = iDoors;  this.mpg = iMpg;  this.drivers = new Array("Mike","John");  if (typeof Car._initialized == "undefined") {    Car.prototype.showColor = function() {      alert(this.color);    };    Car._initialized = true;  }}

TIY

直到检查 typeof Car._initialized 是否等于 “undefined” 之前,这个构造函数都未发生变化。这行代码是动态原型方法中最重要的部分。如果这个值未定义,构造函数将用原型方式继续定义对象的方法,然后把 Car._initialized 设置为 true。如果这个值定义了(它的值为 true 时,typeof 的值为 Boolean),那么就不再创建该方法。简而言之,该方法使用标志(_initialized)来判断是否已给原型赋予了任何方法。该方法只创建并赋值一次,传统的 OOP 开发者会高兴地发现,这段代码看起来更像其他语言中的类定义了。

来源:w3school

 Posted by ian at 12:25 Tagged with: ECMAScript