这篇文章主要介绍js中,原型与闭包的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强> 1,这关键字强>
,有对象指向对象,
b,没对象指向全局变量(窗口);
c,有新指向新出的新对象,
d,绑定,call&应用改变这样的指向;
e, setTimeout和setInterval这指向窗口;
f,箭头函数这是由函数定义时候确定的;
var加法器={ 基础:1、 添加:函数(){ var f=v=比;v + this.base; 返回f (a); }, addThruCall:函数inFun (a) { var f=v=比;v + this.base; var b={ 基地:2 }; 返回f。调用(b); } };
var obj={ 我:10, b:()=比;console.log(这一点。我,这个), c:函数(){ 控制台。日志(这。我,) } } obj.b ();//定义窗口{…}原型 obj.c ();{//10对象……}
<强> 2,原型强>
原型:
原型:每一个对象都会在其内部初始化一个属性:即原型;
原型链:当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么就回去<代码> __proto__> 代码里找这个属性,这样一直找下去就是:原型链;
<代码>运算符代码>原理是判断实例对象的__proto__和生成该实例的构造函数的原型是不是引用的同一个地址。
<代码> hasOwnProperty> 代码是JavaScript中唯一一个处理属性但是不查找原型链的函数。
构造函数,→原型→原型对象→构造函数→构造函数
构造函数→新→实例对象
实例对象→__proto__→原型对象→__proto__→原型对象→→零
<强> 强>
变量声明与函数声明,其作用域会提升到方法体的顶部;
作用域:
, javascript没有块级作用域
b, javascript除了全局作用域之外,只有函数可以创建的作用域。作用域在函数定义时就已经确定了。而不是在函数调用时确定。
闭包:
概念:内部函数可以访问外部函数中的变量;
使用:函数作为返回值;函数作为参数;
作用:封装变量,收敛权限;
缺点:消耗内存
<强>创建对象的方法强>:
对象字面量;
构造函数;
立即执行函数;
Object.create ();
<强>新对象过程强>:
创建新对象,
这指向这个新对象,
执行代码;
返回;
<强>类与继承强>:
<强>类的声明强>:
函数动物(){ this.name=& # 39;名字# 39;; }//es6 类Animal2 { 构造函数(){ this.name=& # 39; name2& # 39;; } }
<强>继承强>:
1。借助构造函数实现继承
父函数(){ this.name=& # 39;父母# 39;; } 函数子(){ Parent.call(这个); 这一点。类型=& # 39;child1& # 39;; }
缺点:
部分继承;
继承不到父类原型对象上的方法;(只有父类的属性挂载到子类上了,孩子的原型没变为Child.prototype继承不了父母的原型)
2。原型链继
父函数(){ this.name=& # 39;名字# 39;; } 函数子(){ 这一点。类型=& # 39;孩子# 39;; } 的孩子。原型=new父();
缺点:原型链上原型对象是共用的。(原型的属性修改,所有继承自该原型的类的属性都会一起改变)
3。组合方式
父函数(){ this.name=& # 39;父母# 39;; } 函数子(){ Parent.call(这个); 这一点。类型=& # 39;孩子# 39;; } 的孩子。原型=new父();
缺点:
父类执行函数执行两次;
构造函数指向父类;
父函数(){ this.name=& # 39;父母# 39;; } 函数子(){ Parent.call(这个); 这一点。类型=& # 39;孩子# 39;; } 的孩子。原型=Parent.prototype;
缺点:
子类构造函数指向父类
父函数(){ this.name=& # 39;父母# 39;; } 函数子(){ Parent.call(这个); 这一点。类型=& # 39;孩子# 39;; } 的孩子。原型=Object.create (Parent.prototype); Child.prototype。构造函数=孩子;
优点:
子类的原型指向Object.create (Parent.prototype),实现了子类和父类构造函数的分离,但是这时子类中还是没有自己的构造函数,