原型、原型链、闭包立即执行函数、插件开发

什么是原型

原型prototype是function对象的一个属性,打印出来他本身也是一个对象,它以对象的形式存在,是构造函数的静态属性prototype,在内存中它里面保存的是该对象的引用

  function HandPhone(){}
        console.log(HandPhone.prototype)

在这里插入图片描述
原型解决了什么问题?
提出相同的内容,写到prototype上从而减少代码冗余,降低耦合,让构造函数创建的实列对象都能够拥有共享

  function HandPhone(){}
        HandPhone.prototype.rom = 'hix';
        HandPhone.prototype.ram = '6G';
        var h1 = new HandPhone();
        var h2 = new HandPhone();
        console.log(h1.rom, h2.ram)


        console.log(HandPhone.prototype);

在这里插入图片描述
实例化对象不能对构造函数的prototype进行修改
通过实列化的对象是不能对HandPhone.prototype对上的属性进行增删改的,只能查。

constructor指向构造函数本身
constructor属性是属于 构造函数.prototype的, rpototype的constructor属性指向构造函数本身,但是可以修改它的指向,因为它只是prototype对象上的一个属性,它里面保存的是构造函数的引用,所以可以修改。

 function Tel() {}
        function HandPhone(){}
        HandPhone.prototype.rom = 'hix';
        HandPhone.prototype.ram = '6G';
        //可以更改构造函数的指向
        HandPhone.prototype = {
            constructor: Tel,
        }
        var h1 = new HandPhone();
        var h2 = new HandPhone();


        console.log(HandPhone.prototype);

在这里插入图片描述

原型与实列对象的关系
1、prototype使构造函数的属性,它是一个对象,构造函数.prototype的方式可以访问到原型,prototype是构造函数构造出来的实列对象的公共祖先
2、所有被该构造函数构造出的对象都可以继承原型上的属性和方法
3、当实列对象没有某个属性或方法的时候就会去prototype原型上去找

__proto__是实例才拥有的,其实就是每个实列化对象的原型的容器
当构造函数被new操作的时候,会产生this,this对象里面默认会有一个__proto__默认会有实例化对象的原型

关于构造函数、prototype、proto
构造函数通过new关键字实列化对象的时候的步骤:
1、new关键字在构造函数中隐式的创建了一个this‘空对象’,这个this对象里面默认会有实例化对象的原型存在__proto__中,并将构造函数中this的指向这个空对象
2、初始化实列对象的属性和方法
3、构造函数指向完成以后隐式的返回this对象(这里的返回值,如果你写了返回基础类型是没用,但是如果返回一个对象,那么将会覆盖隐式返回的this)
4、将实例化后的this对象赋值给全局变量进行保存,此时实列化对象已经完成实列化

      function Car(){
      //实例化对象隐式生成this
      //this = {
     // __proto__: Car.prototype
     // }
      }
        Car.prototype.name ="benze";
        var car = new Car()
        console.log(car)
        console.log(car.name) //能访问,自身没有就到__proto__对应的 Car.prototype中 去找

在这里插入图片描述
__proto__是可以更改的,它里面保存的是构造函数的prototype的引用

function Person(){}
Person.prototype.name = '张三';
//Person.prototype = {}
var p1 = {
name: '李四'};
var person = new Person();
 console.log(person.__proto__);
 console.log(person.name);
 person.__proto__ = p1
console.log(person.name); //person.__proto__是可以更改的

__proto__需要注意的点
1、__proto__属性是实例化以后的结果,__proto__属性是实例化对象的隐式属性,如果不通过new关键字对构造函数进行实列化,是不会存在创造实列对象this的,__proto__属性也就不存
2、__proto__是一个容器,存放实例化对象原型的容器 -》proto:构造函数.prototype
3、因为__proto__属性中保存着构造函数的prototype属性,所以构造函数.prototype是属于实例化对象的,不是属于构造函数
4、每一个实列对象都有__proto__属性

window return

return
return关键字声明将终止函数的执行并且返回一个指定的值给调用者,如果函数没写返回值默认返回undefind
window
window作为全局对象可以将属性和方法挂载到全局对象上,然后通信全局对象对属性和方法进行访问操作
return和window的区别
return可以终止函数执行,window不能;return可以返回一个指定的值,而window则是将它挂载到全局对象上

插件写法

插件模块一般程序在加载的时候就能执行,因此需要使用立即执行函数,也可以把方法放到window上,通过window.方法名执行,如果不需要立即执行的,需要通过调用方法先进行一次执行,一般插件开发都是面向对象的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值