作家
登录

JavaScript深入之创建对象的多种方式以及优缺点

作者: 来源: 2017-05-12 10:49:36 阅读 我要评论

  •             getName: function () { 
  •                 console.log(this.name); 
  •             } 
  •         } 
  •     } 
  •  
  • var person1 = new Person('kevin'); 
  • var person2 = new Person('daisy'); 
  •  
  • // 报错 并没有该办法 
  • person1.getName(); 
  •  
  • // 注释掉落膳绫擎的代码,这句是可以履行的。 
  • person2.getName();  
  • 为了解释这个问题,假设开端履行var person1 = new Person('kevin')。

    如不雅对new和apply的底层履行过程不是很熟悉,可以浏览底部相干链接中的文┞仿。

    我们回想下new的实现步调:

    1. 起首新建一个对象
    2. 然后将对象的原型指向Person.prototype
    3. 然后Person.apply(obj)
    4. 返回这个对象
    1. function Person(name) { 
    2.     this.name = name
    3.  
    4. Person.prototype = { 
    5.     constructor: Person, 
    6.     getName: function () { 
    7.         console.log(this.name); 
    8.     } 
    9. }; 
    10.  
    11. var person1 = new Person();  

    也就是说打着构造函数的幌子挂羊头卖狗肉,你看创建的实例应用instanceof都无法指向构造函数!

    4.1 动态原型模式

    留意这个时刻,回想下apply的实现步调,会履行obj.Person办法,这个时刻就会履行if语句内的内容,留意构造函数的prototype属性指向了实例的原型,应用字面量方法直接覆盖Person.prototype,并不会更改实例的原型的值,person1依然是指向了以前的原型,而不是Person.prototype。而之前的原型是没有getName办法的,所以就报错了!

    如不雅你就是想用字面量方犯写?码,可以测验测验下这种:

    1. function Person(name) { 
    2.     this.name = name
    3.     if (typeof this.getName != "function") { 
    4.         Person.prototype = { 
    5.             constructor: Person, 
    6.             getName: function () { 
    7.                 console.log(this.name); 
    8.             } 
    9.         } 
    10.  
    11.         return new Person(name); 
    12.     } 
    13.  

    14.   推荐阅读

        JavaScript异步与Promise实现

      【引自熊建刚的博客】媒介如不雅你已经对JavaScript异步有必定懂得,或者已经浏览过本系列的其他两篇文┞仿,那请持续浏览下一末节,若你还有困惑或者想懂得JavaScript异步机制与编程,可>>>详细阅读


      本文标题:JavaScript深入之创建对象的多种方式以及优缺点

      地址:http://www.17bianji.com/lsqh/35175.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)