好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JavaScript的中对象创建和继承原理

JavaScript的中对象创建和继承原理

 

  今天我不谈什么技术细节了,这个太多人聊了,如果真想知道,那就去买个书或者下个电子书看看!今天我就唠闲嗑,想到什么说什么,没有主题,胡乱的聊。如果不当之处,忘请见谅,我就想打破以往的思维方式,乱想,想到什么说什么,这个应该就叫自由吧!

 

  作为PHP程序员,Javascipt是你居家旅行必备的工具,所以学好Javascipt我们任重道远。

 


水平

 

  你的Javascript功底如何,你如何考证?工作年限吗?我工作了已经有些年头了,有些时候还不如刚工作的coder,估计是笨了点的缘故。

  我与她为伍这么长时间,还是不了解她,所以我总是思考,我怎样才能真正的征服她?

  


混乱

 

  没事我喜欢去浏览各个巨头互联网公司的JS代码,乖乖,大部分都进行了压缩。这怎么看,那就看能看的地方,打开浏览器的查看源码,里面真是赏心悦目啊,各种形式的JS嵌入方式,有以script标签镶金去的,有外链的,也有直接写在div标签的。——乖乖真够乱的。

 

  难道这些公司程序员都很差劲吗?应该不是,既然是巨头公司,应该是不惜金钱,招兵买马。我猜应该很多是历史遗留问题,主要是初期没有想好整个代码的后期运转(估计当时的coder没想这么远),所以现在演变成大部分程序员按照自己喜欢的方式去写代码。

 


浏览器

 

  现在的浏览器不是个省心的玩意,大家都喜欢玩自己的一套,所以兼容问题很多时候让人头疼。

 

  但我们应该明白浏览器执行js代码是按照单进程方式进行的,一旦有一个地方消耗比较长的时间,那么就有可能拖死后面的代码了。——所以很多时候,要求把js代码放在页面底部,有些特殊的业务非要放在前面,那我们也没有办法了。很多时候,比较费时费力的业务都放置在后加载上,也就是页面加载完了(或触发事件,比如点击、滚动)去处理。

 

 

术语

 

  要想学好一门东西,要想跟人沟通更容易一些,你就必须了解有关的常用名词。如以下的一些名词:

  变量污染:变量在页面中乱用,有的时候多人开发,A用了个变量叫a,B在纷杂的页面中也起了个变量a,结果把A的变量a给冲掉了。这个主要是因为代码命名上没有一个明确的规范。

  代码重用:这个应该是常见的毛病,就是一个功能写了多次。常常是因为程序员不太关注整个js代码,还有就是代码缺少规范,缺少文档导致。

 


平衡

 

  js文件数量和文件大小之间的平衡:文件小了那么自然的文件就多了,自然请求数就多了,增加服务器的压力。文件大了,加大了服务器的IO流,很可能产生阻塞现象。

 

  缓存平衡:现在很多人都喜欢使用缓存,尽量把缓存往前搁置。这也要量力而行,经常修改的文件我们尽量把缓存时间设置的短一些,一些常用的工具类文件,我们就加大对它的缓存时长。——常用的方式是,header缓存,服务端js文件设置缓存时长。

 

 

总结

 

   我没有聊到具体的细节问题,只是范范的说了说,若有错误请指正。我也希望有人能有所补充,这样共同进步,但是不要说的太深。

对象创建:

当一个函数对象被创建时候,Function构造器产生的函数对象会运行类似这样的代码:
this.prototype={constructor:this};
假设函数F
F用new方式构造对象时,对象的constructor被设置成这个F.prototype.constructor
如果函数在创建对象前修改了函数的prototype,会影响创建出来对象的construtor属性
如:

 function   F(){};
F.prototype ={constructor:'1111' };
  var  o= new  F(); //  o.constructor===‘1111’ true 

继承原理:

JavaScript中的继承是使用原型链的机制,每个函数的实例都共享构造函数prototype属性中定义的数据,要使一个类继承另一个,需要把父函数实例赋值到子函数的prototype属性。并且 在每次new实例对象时,对象的私有属性__proto__会被自动连接到构造函数的prototype。

instanceof就是查找实例对象的私有prototype属性链来确定是否是指定对象的实例

具体实例:

 //  instanceof实现 
 function   Myinstanceof(obj,type)
{
     var  proto= obj.__proto__;
     while  (proto)
   {
         if (proto ===type.prototype) break  ;
       proto = proto.__proto__;
   }
     return  proto!= null  ;
}


  function   View(){}
  function   TreeView(){}
TreeView.prototype = new  View(); //  TreeView.prototype.__proto__=TreeView.prototype 自动完成 
TreeView.prototype.constructor=TreeView; //  修正constructor 
 var  view= new  TreeView(); //  view.__proto__=TreeView.prototype 自动完成 
alert(view  instanceof  View);  //  true 查找到view.__proto__.__proto__时找到 
alert(view  instanceof  TreeView);  //  true 查找到view.__proto__时找到 
alert(Myinstanceof(view,View));   //  true 
alert(Myinstanceof(view,TreeView));  //  true 

上面自定义的Myinstanceof就是自己实现的一个instanceof功能的函数,由于IE内核实例存储prototype不是__proto__,所以Myinstanceof会无法通过,其他浏览器上应该都没有问题

 

 

分类:  JavaScript

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于JavaScript的中对象创建和继承原理的详细内容...

  阅读:39次