JS中prototype出现的理由?原型模式是怎么演变而来的?

首先我们知道创建对象的三种模式:工厂模式、构造函数模式、原型模式;(它们是递进关系的)

1. 工厂模式

  • 这种模式解决了创建多个相似对象的问题,但是这种模式却无法识别创建出来的对象是属于那种类型的,都属于Object ?
    function createPerson(name, obj, job) {
                var o = new Object();
                o.name = name;
                o.obj = obj;
                o.job = job;
                o.sayName = function() {
                    alert(this.name);
                };
                return o;
            }
            var person1 = createPerson('mary', 20, "software Engineer")
    	```	
    

2. 构造函数模式

  • 解决了工厂模式的问题,构造函数中可以将实例标识为一种特定的类型
    alert( person1 instanceof Person); // true
    在构造函数中定义一个方法,该方法是大家公用的应避免重复创建浪费空间,解决方法是
    将该方法放到全局那么每个子例都能调用到,但这样就没有任何封装可言了
    function Person(name, obj, job) {
    				this.name = name;
    				this.age = age;
    				this.job = job;
    				this.sayName = function() {
    					alert(this.name);
    				}
    			};
    var person1 = new Person("mary", 20, "Software Engineer");
    	
    

3. 原型模式

  • 因为之前用构造函数来创建的话,每一个实例都要创建一块和构造函数相同大小的空间来
    存储构造函数的原有属性和方法,这样会导致空间资源紧张,
    而原型模式的先进在于,我们用一个指针 prototype 来指向一个原型对象的属性和方法即可,
    需要用的时候我们再根据这些指针指向的地址使用这些方法即可,而我们的new 构造函数仅仅
    只是个空对象(为了标明我们是属于哪种类型),提高了我们的工作性能;
     function Person() { }
            Person.prototype.name = "Mary";
            Person.prototype.age = 29;
            Person.prototype.job = "Software Engineer"
            Person.prototype.sayName = function() {
                alert(this.name);
            };
            var person1 = new Person();
           
    
    

这幅图是我融合了各大网站牛人总结的精华,希望大家能好好梳理一下
在这里插入图片描述
基于上面的图片我们说一下:

  • 所有的prototype都是Object的instance,所以所有prototype的__proto__都指向Object.prototype。
  •   (1)
      var person2 = { } ; //空对象
      Object.getPrototypeOf(person2) // Object
      (2)
      function Person() { }
              Person.prototype.name = "Mary";
              Person.prototype.age = 29;
              Person.prototype.job = "Software Engineer"
              Person.prototype.sayName = function() {
                  alert(this.name);
              };
       var person1 = new Person();
      
      Object.getPrototypeOf(person1) =
      {name: "Mary", age: 29, job: "Software Engineer", sayName: ƒ, constructor: ƒ}
    

``

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值