面向对象:

对代码的一种抽象,对外统一提供调用接口的编程思想


对象的属性:事物自身拥有的东西

对象的方法:事物的功能

对象:事物的一个实例

对象的原型:.prototype -> 内存地址 -> 存储了一个对象

    function fn(){
return 1;
}
alert(fn.prototype);//[object Object]

通过new Function创建的对象是函数对象,其他的都是普通对象

var obj=new Function(n1,n2,n3,...functionBody());
//构造函数对象 前面是一系列参数,后面是自定义函数体
//不过构造器构造的对象,效率比较低
//参数顺序不能改变,必须一一对应 var add=new Function("a","b","return a+b");
var sum=add(3,5);
alert(sum);//

闭包

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数)

全局变量在函数内部可以访问

var n=100;
function fn(){
alert(n);//
}
fn();

函数内部的变量,在外部不能访问

function fn(){
var n=100;
}
fn();
alert(n);//报错 n is not defined

有时需要在外部访问函数内部的变量

解决方法:在函数内部再定义一个函数,输出需要的变量,然后将该内部函数作为返回值

function fn(){
var n=100;
function fn2(){
alert(++n);
}
return fn2;
}
fn()();//

闭包:函数b在函数a内嵌套,函数a需要返回函数b

用途:1、读取函数内部变量  2、让函数内部变量保留在内存中,不随着函数的执行结束而被销毁

function fn(){
var n=100;
nAdd=function(){
n++;
}
function fn2(){
alert(n);
}
return fn2;
}
var res=fn();//将fn()赋值给变量后,内部变量不会在每次执行时被初始化
res();//
nAdd();
res();//

闭包的优缺点:

优点-有利用封装,可以访问局部变量

缺点-内存占用,容易产生内存泄漏

闭包可以使用,但要谨慎使用


在html中创建任意几个li,利用闭包特性实现点击li弹出它的索引值

var lis=document.querySelectorAll("li");

for(var i=0;i<lis.length;i++){
(function(i){
lis[i].onclick=function(){
alert(i);
}
})(i);
}

匿名函数自调用,传入了for循环里面的i值,保存每一次循环的i值

for循环会先执行完毕,然后形成多个作用域

每个i值会作为实参传入函数中,当点击li的时候,弹出的i值就是作用域中的i值

字面式声明对象-最基本的方式

//字面式
var person={
name:"cyy",
age:25,
eat:function(food){
alert("我在吃"+food);
}
}
console.log(person.name);//cyy
person.eat("西瓜");//我在吃西瓜
console.log(person instanceof Object);//true

new Object() 构造函数

Object是所有对象的基类,所有javascript对象都是由object延伸的

//new Object()构造函数
var person=new Object();
person.name="cyy";
person.age=25;
person.infos=function(str){
return this.name+" "+this.age+" "+str;//this指向当前对象
}
alert(person.infos("很可爱"));//cyy 25 很可爱

构造方法声明对象

使用new来实例化

函数内部只能用this来访问属性和方法

//构造方法声明对象
function Person(name,age){
this.name=name;//this.name是属性 name是参数
this.age=age;
this.show=function(){
alert(this.name+" "+this.age);//this指向当前对象,不同的实例对象是独立的
}
}
var cyy=new Person("cyy",25);
cyy.show();//cyy 25 var cyy2=new Person("cyy2",18);
cyy2.show();//cyy2 18

工厂方式声明对象:按照某种模式,可以不断的创造对象

在一个函数内部使用 new Object() 创建一个对象,并且返回这个对象

//工厂模式
function person(name,age){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.infos=function(){
return this.name+" "+this.age+" 很可爱";//对象的方法中要调用属性,必须使用this
}
return obj;
}
var cyy=person("cyy",25);
alert(cyy.infos());//cyy 25 很可爱 var cyy2=person("cyy2",25);
alert(cyy2.infos());//cyy2 25 很可爱 // cyy和cyy2两者没有联系

构造方式和工厂模式的区别:

构造方式不会创建出一个对象,也不会返回这个对象,将属性赋值给this


原型模式声明对象

任何js方法或者函数,都自带prototype属性,并且以对象方式存在

函数本身声明为空内容,通过prototype声明属性和方法,最后new这个函数

//原型模式
function person(){ }
//alert(person.prototype);//[object Object]
person.prototype.name="cyy";
person.prototype.age=25;
person.prototype.infos=function(){
return this.name+" "+this.age;
} var p=new person();
alert(p.infos());//cyy 25

原型模式也可以以json数据的方式来定义属性和方法

//原型模式
function person(){ } //json数据格式
person.prototype={
name:"cyy",
age:25,
infos:function(){
alert(this.name+" "+this.age);
}
} var p=new person();
p.infos();//cyy 25

混合模式:构造模式+原型模式

//混合模式:构造+原型
function person(name,age){
this.name=name;
this.age=age;
} person.prototype={
addr:"China",
infos:function(){
alert(this.name+" "+this.age+" "+this.addr);
}
} var p=new person("cyy",25);//构造函数部分需要传参,原型部分直接定义
p.infos();//cyy 25 China

面向对象+闭包+三种对象的声明方式(字面式、new Object、构造函数、工厂模式、原型模式、混合模式)的更多相关文章

  1. Objective-C:三种文件导入的方式以及atomic和nonatomic的区别

    一.三种文件导入的方式比较:   类的前项声明@class.import.include: 1.采用@class 类名的方式,它会告诉编译器有这么一个类,目前不需要知道它内部的实例变量和方法是如何定义 ...

  2. Spring中三种配置Bean的方式

    Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...

  3. 浅淡Webservice、WSDL三种服务访问的方式(附案例)

    Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...

  4. Objective-C:三种文件导入的方式比较

    三种文件导入的方式比较:   类的前项声明@class.import.include:   1.采用@class 类名的方式,它会告诉编译器有这么一个类,目前不需要知道它内部的实例变量和方法是如何定义 ...

  5. 三种实现Ajax的方式

    本文主要是比较三种实现Ajax的方式 1. prototype.js 2. jquery1.3.2.min.js 3. json2.js Java代码 收藏代码 后台处理程序(Servlet),访问路 ...

  6. javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式

    创建js数组 var array=new Array(); Java中创建数组 private String[] array=new String[3]; 两个完全不同的,js中是可变长度的 添加内容 ...

  7. (转)Spring的三种实例化Bean的方式

    http://blog.csdn.net/yerenyuan_pku/article/details/52832793 Spring提供了三种实例化Bean的方式. 使用类构造器实例化. <be ...

  8. 【转】ZYNQ中三种实现GPIO的方式

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/husipeng86/article/det ...

  9. 三种Singleton的实现方式

    来源:http://melin.iteye.com/blog/838258 三种Singleton的实现方式,一种是用大家熟悉的DCL,另外两种使用cas特性来实现. public class Laz ...

随机推荐

  1. python数据分析常用图大集合

    目录 一.折线图 二.直方图 三.垂直条形图 四.水平条形图 五.饼图 六.箱线图 七.热力图 八.散点图 九.蜘蛛图 十.二元变量分布 十一.面积图 十二.六边形图 以下默认所有的操作都先导入了Nu ...

  2. Spring注解开发系列Ⅸ --- 异步请求

    一. Servlet中的异步请求 在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理.如果要处理一些 ...

  3. hashlib 模块的用法

    import hashlib #多用于加密a=hashlib.md5()print(a) #<md5 HASH object @ 0x00000000021CCF90> a.update( ...

  4. MySQL5.7 中的query_cache_size

    摘自:http://jackyrong.iteye.com/blog/2173523 1 原理    MySQL查询缓存保存查询返回的完整结果.当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行 ...

  5. 互联网那些事 | MQ数据丢失

    本系列故事的所有案例和解决方案只是笔者以前在互联网工作期间的一些事例,仅供大家参考,实际操作应该根据业务和项目情况设计,欢迎大家留言提出宝贵的意见 背景 小王和小明分别维护分布式系统中A.b两个服务, ...

  6. vmware安装kvm虚拟机

    1. 概述 本篇博客主要使用运行在win10专业版上的vmware workstation 15 pro虚拟化软件,安装centos7.7最小化系统,并在centos7上安装kvm虚拟机,实现快速创建 ...

  7. 【编程的乐趣-用python解算法谜题系列】谜题一 保持一致

    谜题一 保持一致 谜题 假设有一大群人排队等待观看棒球比赛.他们都是主场球迷,每个人都戴着队帽,但不是所有人都用同一种戴法,有些人正着戴,有些人反着戴. 假定你是保安,只有在全组球迷帽子戴法一致时才能 ...

  8. C++读取MNIST数据集

    MNIST是一个标准的手写字符测试集. Mnist数据集对应四个文件: train-images-idx3-ubyte: training set images  train-labels-idx1- ...

  9. 把"重试"抽象出来做个工具类吧

    背景介绍 我们在工作中难免会写一些重复性的代码,所以需要我们具备一定的抽象能力,比如把共同的逻辑抽取到抽象类中,也可以通过一些工具类来避免冗余代码 今天这篇文章就是把一个调用服务的重试功能抽取出一个工 ...

  10. Javascript小白经典题型(二)

    51. 输出的是什么? function getInfo(member, year) { member.name = "Lydia"; year = "1998" ...