码迷,mamicode.com
首页 > 其他好文 > 详细

基于原型机制的克隆模式

时间:2016-01-17 12:13:07      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

   在传统的静态语言中,类相当于“模子”,用class来定义,而实例相当于“模具”,就是说实例是通过“模子”class来生成的。但是在js中,并没有class关键字,换句话说js中没有类的概念。但得益于js强大的原型机制,js是可以模拟静态语言中的类的。

   先来看看函数对象Function,对象Function上拥有一个原型对象prototype,即

Function.prototype = {

  call:function(){},

  apply:function(){},

  ......

  __proto__:Object

}

   每个函数function F(){}都是通过Function对象来构造的,也就是说Function.prototype被克隆在函数F里面了,在F里,会有一个专门的属性存储Function.prototype,如下所示

   F.__proto__ = Function.prototype;

   正常情况下如果尝试访问F.call, F.apply会导致失败,因为F函数对象上没有这个方法,但原型机制会在在F上访问失败的时候,会将访问请求委托给F.__proto__,即Function.prototype,这时候便找到了call方法与apply方法了。

   同理,如果访问F.toString, F函数对象上没有该方法,会委托到F.__proto__,即Function.prototype,此时Function.protoype仍然没有toString方法,会继续委托给F.__proto__.__proto__,即Function.protoype.__proto__,即Object对象。

   展开Function.prototype, 如下

Function.prototype = {

  call:function(){},

  apply:function(){},

  ......

  __proto__:{

    toString:function(){},

    valueOf:function(){},

    ...

  }

}

   这个时候便找到了toString方法。。。对原型机制简单的理解就是沿着这样的链条一直访问下去F.__proto__.__proto__......__proto__,直到最终找到要访问的属性,而Object对象里面是没有__proto__的,也就是说Object对象就是尽头了,因此Object对象也是我们所说的顶层对象,所有对象都会继承自Object对象。

   F.__proto__代表的是F继承的对象,而F.prototype代表的是可以被继承的对象,展开F.prototype,如下

F.prototype={

   constructor: function func(){},

   __proto__:Object

}

   在js中,实例化一个函数的写法如下:

   var obj = new F();

   克隆模式指的是F的原型对象克隆到obj上了,即:obj.__proto__ = F.prototype,这样通过obj可以访问到obj.toString与obj.valueOf等方法。

   用js代码模拟new Func()这个过程,先看看正常的写法:

function Person(name,age){

  this.name = name;

  this.age = age;

}

Person.prototype.sayName = function(){

  console.log(this.name);

}

var obj1 = new Person("Li",34);

   其底层实现机制的模拟写法:

function createObj(func){

  var obj = {};   //先新建一个对象

  obj.__proto__ = func.prototype;   //将函数的原型对象克隆过来

  var Func = Array.prototype.shift.apply(arguments);  //将第一个参数移出去并返回给Func,此时arguments就只剩下要传给Func的参数了

  Func.apply(obj,arguments);  //调用apply方法强制改变this的指向

  return obj;   //返回

}

   var obj = createObj(Person,"Fu",22);

   console.log(obj.age);   //22

   console.log(obj.sayName());   //Fu

   总结来说:

①原型机制指的是,在访问F.xxxx的时候,会沿着F.__proto__.......__proto__一直访问下去,直到找到xxxx或者是到了尽头。

②克隆模式指的是,var sample = new Func();这句话的过程是会先生成一个对象obj,使得obj.__proto__ = Func.prototype,这样obj就继承了Func的原型,再经过一定的处理后,返回obj。

基于原型机制的克隆模式

标签:

原文地址:http://www.cnblogs.com/xiaodianxie/p/5136980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!