JavaScript实现类,有多种方法。



方法一:构造方法。
  1. function coder(){
  2. this.name = '小王';
  3. this.job = '程序员';
  4. this.coding = function ()
  5. {
  6. alert('我正在写代码');
  7. }
  8. }

  9. var coder=new coder();
  10. alert(coder.name);
  11. coder.coding();
复制代码
方法二:工厂方法。
  1. function createCoderFactory(){
  2. var obj=new Object();
  3. obj.name = '小王';
  4. obj.job = '程序员';
  5. obj.coding = function (){
  6. alert('我正在写代码');
  7. };
  8. return obj;
  9. }
  10. var coder = createCoderFactory();
  11. alert(coder.name);
  12. coder.coding();
复制代码
但工厂方法和构造方法都有着一个相同的缺点,就是每创建一个实例,都会实例化该类的每个函数。

方法三:原形链。
  1. function coder(){}
  2. coder.prototype.name = '小王';
  3. coder.prototype.job = '程序员';
  4. coder.prototype.coding = function(){
  5. alert('我正在写代码');
  6. };
  7. var coder = new coder();
  8. alert(coder.name);
  9. coder.coding();
复制代码
但原行链有个缺点就是它所有属性都共享,只要一个实例改变其他的都会跟着改变。如:
  1. var coder1 = new coder();
  2. var coder2 = new coder();
  3. alert(coder1.name); /*显示“小王”*/
  4. coder2.name = '老王';
  5. alert(coder1.name); /*示“老王”*/
  6. alert(coder2.name); /*这个也显示“老王”*/
复制代码
方法四:混合方式。

以上三种都有着各自的缺点,所以我们要加以改进。
  1. function coder(){
  2. this.name = '小王';
  3. this.job = '程序员';
  4. }
  5. coder.prototype.coding = function(){
  6. alert('我正在写代码');
  7. };
复制代码
方法五:动态原链。

要解决前三种的缺点,还有一种方法。
  1. function coder(){
  2. this.name = '小王';
  3. this.job = '程序员';
  4. if (typeof(coder._init) == 'undefined'){
  5. this.coding = function ()
  6. {
  7. alert('我正在写代码');
  8. };
  9. this._init = true;
  10. }
  11. }
原文地址:https://www.cnblogs.com/zengwei/p/1700557.html