面向对象、原型、闭包

**闭包:

作用域:一个变量的可用范围

作用域链:记录一个函数,可用作用域的*对象*!

方法定义时:创建2个对象:

1个对象:保存方法体的方法对象

2个对象:当前方法的作用域链对象

作用域链对象中有一个元素指向全局对象

方法调用过程中:创建1个对象,作用域链中多出一个新元素

1个对象:创建该方法*本次调用*的*活动对象*

活动对象中保存了*本次调用*的局部变量

如果方法定义中没有局部变量,活动对象中不会包含任何变量

作用域链中新追加的元素,引用了活动对象

方法调用结束后:作用域链中的新元素出栈

活动对象无人使用,自动回收释放

***闭包:

为什么用闭包:全局变量可共享,但容易被污染

局部变量虽然私有,但不可重用/共享

解决:3步:1. 用大的方法将变量和操作变量的方法封装起来

2. 在外层方法结尾,将操作变量的方法对象返回

3. 在全局,使用专门的方法名接住外层方法返回的函数对象

何时使用闭包:保护可反复使用的局部变量

判断闭包:3特点:

1. 方法嵌套;

2. 内层方法使用了外层方法的局部变量

3. 内层方法被外层方法返回到外部,被反复调用。

1. 面向对象:

1. 创建对象:3种方式

2. 原型:

3. 继承:

1. 创建自定义对象:

对象:专门描述现实中一个东西的属性和功能的程序结构

对象中封装了一个东西的属性以及对属性的操作方法

如何创建:3种方式:

1. 对象直接量的方式:

var obj={属性名:属性值,

... ...}

***js中对象的本质,其实是关联数组/Hash数组

存入属性时,以hash算法,根据属性名计算存储位置

读取属性时,以hash算法,快速算出存储位置,直接读取

***hash数组优点:极快的查找速度。与数据量无关。

对象中的方法内,访问对象自己的属性:this.属性名

this.读作“当前对象的”

3. 使用对象模板/构造函数创建对象:

何时使用:使用统一的数据结构,反复创建多个对象

构造函数作用:2个:

1. 接收要封装到对象中的属性值

2. 用接收到的属性值,初始化对象的属性

如何使用:2步:

1. 先定义统一的对象结构/构造函数

function 构造函数名(参数1,参数2,....){

this.属性1=参数1;

this.属性2=参数2;

this.方法名=function(){......}

}

其中,this表示当前正在创建的对象

2. 使用new关键字,调用构造函数创建对象

var obj=new 构造函数名(参数值1,参数值2,...);

1. new 创建一个对象

2. 按构造函数的规定,初始化对象中的属性

3. ?

4. 将新对象的地址,存入等号左边的变量中

. this:用在函数内,指代当前正在调用方法的对象。

*this和定义时的对象无关。仅和调用时的对象有关*

面向对象三大特点:封装,继承,多态

封装:对象内封装了描述一个事物的属性和方法

多态:同一个对象,可以表现出不同的状态

继承:子对象可以使用父对象中的属性和方法

2. 原型:集中存储多个对象共用的属性值和方法的父对象

每个函数都有一个prototype属性指向自己的原型对象

何时使用构造函数的原型?

多个对象共用的属性值和方法,都要放在原型中。

一次创建,反复使用。

如何向原型中添加属性和方法:

构造函数名.prototype.共享属性名=属性值

构造函数名.prototype.共享方法名=function(){...}

为对象扩展属性:

1. 自有属性:通过对象的引用添加的属性;

其它对象无法访问。

2. 原型属性:通过原型对象添加的属性;

所有继承自原型的子对象都可以访问

获得对象的原型:2种

1. 通过构造函数的prototype属性获得

2. 通过Object.getPrototypeOf(obj)获得

检测自有属性和原型属性:

1. 检查在整个原型关系上是否存在某个属性:

var bool="属性名" in 对象

返回true:属性名包含在对象中或

也可能包含在原型对象中

返回false:对象中和原型对象中一定都没有!

2. 检查自有属性:

var bool=obj.hasOwnProperty("属性名")

返回true:对象中包含指定属性名

返回false:仅说明对象中没有,

不能确定原型中是否包含

3. 面向对象:

1. 多态:重写:子对象认为父对象中方法不好用!

可定义自有的同名方法,重写父对象中方法

2. 继承:子对象可以直接使用父对象中的属性和功能

为什么使用继承:代码重用

     如何实现继承:

将要继承的父对象,设置为子对象的原型

2种方式:

1. 修改单个对象的原型:

Object.setPrototypeOf(子对象,父对象)

优:任何时候修改任何对象的父对象

缺:每次仅能修改单个对象

2. 批量修改多个对象的原型:

修改构造函数的原型即可!

构造函数.prototype=父对象

创建对象之前!

优:之后创建的所有子对象,自动继承父对象

缺:必须在创建对象之前修改!

2. prototype:存储多个对象共享的属性值或方法的父对象

1. 所有方法都有prototype属性,指向自己的原型对象

2. 所有对象都有__proto__属性,指向自己的父对象

构造函数创建出的对象:

__proto__指向构造函数的prototype对象

使用直接量创建的单个对象:

__proto__指向Object的prototype对象

3. 继承:子对象直接使用父对象的属性和功能。

原型继承:将一个子对象的原型设置为另一个父对象

如何实现继承:

1. 修改单个对象的__proto__属性

Object.setPrototypeOf(子对象,父对象)

2. 批量修改多个对象的原型:

条件:在使用构造函数创建对象前

构造函数.prototype=父对象

var obj=new 构造函数(属性值1,属性值2,...);

1. new 创建新对象

2. 调用构造函数初始化对象中的属性和方法

3. 将对象的__proto__设置为构造函数的原型

4. 将新创建的对象的地址,存入全局变量obj中。

时间: 2024-08-27 02:53:08

面向对象、原型、闭包的相关文章

javascript面向对象之闭包

javascript面向对象之闭包 学习javascript一段时间了,自己对闭包作出如下总结,如有某点不妥,请君指出,不胜感激! 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量,而在函数外部无法读取函数内的局部变量. 注意点,函数内部声明变量的时候,一定要使用var命令.否则变为全局变量. 简而言之,闭包就是一个受到保护的变量空间. 闭包案例 functon(

JavaScipt面向对象编程----闭包

在javascript中闭包是一个很不好理解的概念,但是确实一个不可逃避的东西,那么今天我们就来一起学习一下闭包. 什么是闭包? 闭包:官方"的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.相信读完这句话以后,你就更加不知道什么是闭包了.其实通俗的说闭包就是一个函数a内部的局部变量s,被该函数内部的函数b所使用,并且a函数返回值为b函数.那么我们就将b函数成为闭包. 为什么会产生闭包这个概念呢?那就要谈谈变量作用域的问题了. 变

JavaScript 随笔2 面向对象 原型链 继承

第六章 面向对象的程序设计 1.创建对象的几种方式 A)工厂模式 function CreatObj(name,sex,age){ this.name=name; this.sex=sex; this.age=age; } 缺点:虽然可以批量创建对象,却不能知道对象的类型 只知道他是Object类型: B)构造函数 function Person(name,sex){ this.name=name; this.sex=sex; this.sayName=function(){ alert(thi

面向对象原型链小结

构造函数: *)构造函数就是初始化对象的函数(给刚创建的对象赋值属性等). *)构造函数就是普通函数,内部的this指向window: 只有实例化对象后才被称为构造函数,内部的this指向实例. *)若构造函数内部存在返回值,且返回值的数据类型为值类型,那么调用这个函数时返回这个实例: 若构造函数内部返回值的数据类型为引用类型,那么调用这个函数时返回复杂数据. *)若构造函数在调用时没有传参,则构造函数的小括号可以省略. *)访问原型的方式:构造函数.prototype => 原型. *)Fun

JavaScript面向对象原型继承

<script type="text/javascript"> //原型链继承 function shape() { this.name="shape"; this.showname=function(){ console.log(this.name); } } function shape_Two() { this.name='shape_Two' } function Triangle(side,height) { this.name="T

关于javascript面向对象之闭包

学习javascript一段时间了,经过师傅的指引,自己对闭包作出如下总结,如有某点不妥,请君指出,不胜感激! 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量,而在函数外部无法读取函数内的局部变量. 注意点,函数内部声明变量的时候,一定要使用var命令.否则变为全局变量. 简而言之,闭包就是一个受到保护的变量空间. 闭包案例 functon(){ var num

JS面向对象-原型对象,实例对象,构造函数的关系

JS中每创建一个函数,该函数就会自动拥有一个prototype属性,为什么那??  因为最根上的object拥有一个prototype属性,而js中所有的对象又都继承自object,所以js中所有的对象都拥有一个prototype属性,而在js中函数也是对象,所以js中每个函数也都有一个prototype属性. 例如:function Person(){...} 和function Dog(){...} 而每一个prototype属性又会获得一个constructor属性 该constructo

Python之面向对象:闭包和装饰器

一.闭包 1. 如果一个函数定义在另一个函数的作用域内,并且引用了外层函数的变量,则该函数称为闭包. def outter(): name='python' def inner(): print name return inner res=outter() 把inner的地址赋值给res res() 相当于执行inner()函数.通过闭包,可以把局部变量在外部也可以使用 2.判断是否为闭包 res.func_closure inner()函数就是一个闭包 3.通过闭包,可以把局部变量在外部也可以

面向对象-原型对象

创建对象 Js中可以用构造函数模式创建对象,如: function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function () { alert(this.name); } } var person1 = new Person("Nicholas", 29, "aa"); var person2 = new Person(&q

面向对象-原型

<script type="text/javascript"> function CreatePeo(n){ this.name=n; } CreatePeo.prototype.emma="好人"//给函数对象prototype属性添加 ,会体现在a.__proto__即在将来实例的父级得到 CreatePeo.prototype.show=function(){//现在就是把车给父亲,两个儿子都可以开 console.log(this.name)//