原型+原型链+闭包+立即执行函数+插件开发初识

一个比较强的分析:针对item的乘除进行封装成方法,针对不同的方法进行item的乘除,但是还是不够简介

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

 

来个更加简洁的:这就有点像java里面的一些封装,多写这样的代码对之后的专业素养能有一个比较大的提升

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

原型:

原型prototype其实是function对象的一个属性,将其打印出来它也是对象。

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

所有被构造函数构造出的对象都可以继承原型上的属性和方法,(当然自己有的先向自己找,自己没有的才去原型上找),任何一个实例化的对象都能访问对应原型上的方法

这就是为什么方法会写在原型上面。属性则写在函数内部,因为属性一般要进行配置

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

 

让实例化的对象去增加prototype是不行的,只是添加this的属性,

而delete 也是无法删除prototype的属性或方法的,delete 只能删除实例化对象this里面的属性或方法的,无法删除prototype里面的,

原型+原型链+闭包+立即执行函数+插件开发初识

对prototype进行规范化写法:因为 xxx.prototype是对象的,所以进行对象化的添加属性与方法,在开发的时候都是这样的写法

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

 

 

 

 

 

 

 

 

 原型上面的构造器的constructor指向的是构造函数本身:

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

通过xxx.prototype.constructor= xxx ;

改变对应的函数

原型+原型链+闭包+立即执行函数+插件开发初识

__proto的产生:在函数实例化之后形成的this{ __proto__:XXX.prototype}

在这里我们要理解:(__proto__属性一定是属于实例化对象的,而不是属于构造函数的),

这里的this是隐式的,只是一个隐式表达给你,写是无法这样写的

但js内部的写法就是这样子的:

 

 

 

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

__proto__:设计的时候就是针对自己找不到的属性和方法能够通过__proto__来去寻找到prototype里面的属性与方法,并且为了不让用户修改用了__ 这样的写法,

__proto__相当于一个容器,能够有个指针能够指向prototype,通过指针来去访问实例对象的prototype,相当于门牌号

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

 

当然__proto__的指向也是能够更改的,只是没有什么意义

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 练习:

 

 

 

原型+原型链+闭包+立即执行函数+插件开发初识

 

 这里对var car =new Car()进行了实例化,所以实例化之后的prototype是没有变化的;

 

 

 

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

只是在__proto__下面的constructor下面的prototype进行了修改

后面的对Car.prototype ={ name:'Mazda'} 的修改,是没有修改实例化之后的prototype,修改的是实例化之前的prototype

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

那么这样:car.prototype.name='Mazda'这样是对this里面的__proto__:进行的一个重新赋值,并相当于重写prototype原型+原型链+闭包+立即执行函数+插件开发初识

 

为什么要把某些属性和方法放在prototype里面,为了一些属性值和方法一样的时候放在prototype进行继承,如果要传参数,动态的获取这个属性的时候,才会放在构造函数里面

 

讲一个非常非常有用的东西,跟上面原理不一样,

window和return的问题:

下面这样return 和window实现的是一样的功能

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

 

window的方法能够直接执行的,因为在函数内部就进行了保存,return则是要进行赋值一个全局变量才能进行执行函数原型+原型链+闭包+立即执行函数+插件开发初识

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

 

对于立即执行函数是非常好写插件的东西,因为在立即执行函数中声明变量是不会污染全局变量的,可以进行隔离

一个插件的标准:

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

 

 对于立即执行函数有一个好的习惯先写一个(;分号)主要是为了怕忘记写,程序不会出错,跟函数声明变成表达式是不一样的

原型+原型链+闭包+立即执行函数+插件开发初识

 

 

 

作业:

写一个插件,任意传两个数字,调用插件内部方法可进行加减乘除功能

 

    ;(function(){   var compute =function(opt){   this.x =opt.firstNum   this.y =opt.secondNum   }   compute.prototype={   plus:function(){        return this.x+this.y   },   minus:function(){         return this.x-this.y   },   mul:function(){       return this.x*this.y   },   div:function(){       return this.x/this.y   } }     window.Compute=compute })()
var compute = new Compute({     firstNum:1,     secondNum:2 })
console.log(compute.plus()); console.log(compute.minus()); console.log(compute.mul()); console.log(compute.div());

 

上一篇:OpenGL Compute Shader Image Processing计算着色器图像处理的实例


下一篇:kubesphere中Metrics Server故障排查