zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2937315.html
Copyright © 2011-2022 走看看