原型模式

创建一个对象通常用到的有两种方法:构造函数和字面量的方法。

   var  coder1 = new Object();  //构造函数
   var coder2 = {};  //字面量的方法

好的,现在让我们想想怎么能使这样单调的代码变得酷起来,可以把创建函数的过程封装起来。


      function createCoder (name, age) {

            var coder = new Object( );

            coder.name = name;
            coder.age = age;
            coder.whatJob = function () {
                   console.log('酷行者');
            }

            return coder;          
   }

这种方法有什么缺点呢?如果你脑中会出现这个问题那你的思想就是超酷的o.o!

缺点,创建的对象没有所属的类,都是单调的Object类


    function createCoder(name, age) {

        var coder = new Object();

        coder.name = name;
        coder.age = age;
        coder.whatJob = function () {
            console.log('酷行者')
        }

        return coder;
    }
    var coder = createCoder('聪聪'28);
    var coder2 = createCoder('明明'28);

    coder instanceof Object; // true
    coder2 instanceof Object; // true

构造函数就可以解决这个问题

   function Coder(name, age) {
        this.name = name;
        this.age = age;
        this.whatJob = function () {
            console.log('酷行者');
        }
    }

    var coder = new Coder('酷酷', 11);
    coder instanceof Coder; //true

而这样的构造函数有什么缺点呢? Cool question.

缺点,每次创造一个新对象的时候,每个实例都会新建两个方法,而这两方法不是同一个Function 的实例,可以理解为如下的代码:

   function Coder(name, age) {
      this.name = name;
      this.age = age;
      this.whatJob = new Function ("console.log('酷行者');") 
   }

   var coder = new Coder('酷酷'21);
   var coder2 = new Coder('超酷'22);

   coder.whatJob === coder2.whatJob; // false

可以怎样解决这样的问题呢?
方法一,把共有的方法放在全局下

   function Coder(name, age) {
       this.name = name;
       this.age = age;
       this.whatJob = whatJob;
   }

   function whatJob() {
      console.log('酷行者');
   }

   var coder = new Coder('Cooler', 18);
   var coder2 = new Coder('Jack', 18);

   coder.whatJob === coder2.whatJob; //true

这样做的表明这个whatJob函数只能被Coder的实例调用,还得特意说明下,但是却放在全局作用域下面,这就自相矛盾了,还有就是一旦构造函数的方法多起来,都放在全局下,就更加乱套了。

为了解决这个问题原型模式出现了

function Coder (name,  age)  {
          this.name = name;
          this.age = age;
}

Coder.prototype.whatJob = function () {
         console.log('酷行者');
 }  

coder.whatJob === coder2.whatJob; //true

原型模式有什么缺点呢?Cool question!It’s your turn.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值