什么是构造函数

简单说构造函数是类函数,函数名与类名完全相同,且无返回值。构造函数是类的一个特殊成员函数。

JavaScript构造函数

* 在JavaScript的世界里没有类的概念,JavaScript是一种基于对象的语言,它包含5中原生数据类型:number,boolean,string,null,undefined

* 除此之外,其他的所有都是对象,函数也是一个对象

* 而所谓Js中的构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为: 构造函数==函数

* 对于Js内置对象,Object、Array、Date等等这些都是构造函数。

//有参构造函数==带参数的函数
function mod(uu) {
var test = uu;
alert(test);
}
//无参构造函数==不带参数的函数
function mod() {
var test = "初始化";
alert(test);
}

* 无参函数主要用于初始化默认值,在部分编程语言中有参函数当不传参的时候默认会有一个无参函数加载,用于初始化类函数

JavaScript构造函数的调用

* Js中使用new运算符来调用构造函数

* 一般称为类的实例化,Js中可以称为对象的实例化

* 构造函数一经实例化后,即会立即执行构造函数内的所有代码

* 而Js中所谓的构造函数与普通函数最大的区别就在于是否使用new调用

//普通函数
function mod(uu) {
var test = uu;
alert(test);
}
mod("这是一个普通函数");
//构造函数
function Mod(uu) {
var test = uu;
alert(test);
}
m = new Mod("这是一个构造函数");

* 这两个函数最终都会立即弹窗,并弹窗赋值内容,也许你会发其实都一样,然而并不是这样的。

真正的JavaScript构造函数

* 首字母大写,以区别于其他函数

* 使用关键字new调用构造函数

* 调用后自动创建this对象,且类型为构造函数类型,可以使用 instanceof 这个运算符进行校验

* 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法

* 通常没有return语句,但可以使用(不推荐),使用时返回值必须是this,或者其它非对象类型的值

* 对象有一个constructor属性,指向它的构造函数,即他返回构造函数本身

* 当方法被实例化后,构造函数会立即执行它所包含的任何代码

1、构造函数如何访问对象中的属性和方法

//构造函数访问公有变量
function Mod() {
//公有属性
this.name = "测试模板";
this.use = "可以直接通过调用对象访问"; //公有方法
this.func = function () {
console.log("公有方法也可以通过调用对象之间访问");
}
}
M = new Mod(); console.log(M.name)//Output:测试模板
console.log(M.use)//Output:可以直接通过调用对象访问
M.func();//Output:公有方法也可以通过调用对象之间访问
//构造函数访问私有变量
function Mod2() {
//私有属性
var name = "测试私有";
var use = "通常不能访问"; //私有方法
var func = function () {
console.log("与私有属性一样,通常不能访问,但可以立即执行");
} //他会立即执行
console.log(name + "----" + use);//Output:测试私有----通常不能访问
func();//Output:与私有属性一样,通常不能访问,但可以立即执行
}
M2 = new Mod2(); //却不可以被被外部所直接访问
console.log(M2.name + "----" + M2.use)//Output:undefined----undefined
M2.func();//Output:报错信息Uncaught TypeError: M2.func is not a function
//可以使用return返回私有变量,从而使得外部可以访问(不推荐)
function Mod3() {
//私有属性
var name = "测试私有";
var use = "通常不能访问"; //私有方法
var func = function () {
console.log("与私有属性一样,通常不能访问,但可以立即执行");
} //使用return返回私有变量
this.getVal = function (v) {
switch (v) {
case "n": return name;
break;
case "u": return use;
break;
case "f": return func();
break;
}
}
}
M3 = new Mod3(); console.log(M3.getVal("n") + "----" + M3.getVal("u"))//Output:测试私有----通常不能访问
M3.getVal("f");//Output:与私有属性一样,通常不能访问,但可以立即执行

2、构造函数如何为对象中的属性和方法赋值

//公有变量赋值
function Mod4(name, age, gender, text) {
this.name = name;
this.age = age;
this.gender = gender;
this.func = function () {
document.write(text);
}
}
M4 = new Mod4("leona", "18", "女", "公有变量的赋值"); console.log(M4.name + "-----" + M4.age + "-----" + M4.gender);//Output:leona-----18-----女
M4.func();//Html:公有变量的赋值
//私有变量赋值
function Mod5(name, age, gender, text) {
var name = name;
var age = age;
var gender = gender;
var func = function () {
document.write(text);
} console.log(name + "-----" + age + "-----" + gender);//Output:leona-----18-----女
func();//Html:公有变量的赋值 }
M5 = new Mod5("leona", "18", "女", "公有变量的赋值");
//我们发现我们不能从外部直接访问私有变量,但我们可以直接为其赋值

3、构造函数如何访问对象的静态变量

//访问静态变量
function Mod6() {
var name = "非静态变量";
var use = "我和name都是非静态变量,我们的生命周期存在于这个函数本身";
var func = function () {
document.write(" 我们可以直接访问静态变量,比如:");
document.write(Mod6.attr1);
document.write(Mod6.attr2);
document.write(Mod6.attr3);
document.write(Mod6.attr4 + " ");
}
func();//html:我们可以直接访问静态变量,比如:苹果香蕉芒果柚子
};
Mod6.attr1 = "苹果";
Mod6.attr2 = "香蕉";
Mod6.attr3 = "芒果";
Mod6.attr4 = "柚子";
Mod6.htmlFunc = function () {
document.write("我和attr1~4都是静态变量,我们的生命周期存在于实例化函数的整个周期");
} M6 = new Mod6(); document.write(M6.attr1);
document.write(M6.attr2);
document.write(M6.attr3);
document.write(M6.attr4);
//M6.htmlFunc();
//Html:undefinedundefinedundefinedundefined
//Output:报错信息Uncaught TypeError: M6.htmlFunc is not a function //我们发现我们并不能直接访问到构造函数的静态变量,这是因为,静态变量是通过构造函数本身去创建的变量,因此我们需要用到constructor获取到构造函数本身,从而达到访问静态变量的目的 document.write(" " + M6.constructor.attr1);
document.write(M6.constructor.attr2);
document.write(M6.constructor.attr3);
document.write(M6.constructor.attr4 + " ");
M6.constructor.htmlFunc();
//Html:苹果香蕉芒果柚子 我和attr1~4都是静态变量,我们的生命周期存在于实例化函数的整个周期

JavaScript学习笔记-构造函数的更多相关文章

  1. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  2. JavaScript:学习笔记(6)——New运算符

    JavaScript:学习笔记(6)——New运算符 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例. 快速开始 当你使用new关键字的时候,会 创建一个新的对象 将th ...

  3. JavaScript:学习笔记(5)——箭头函数=>以及实践

    JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...

  4. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  5. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  7. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  8. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  9. Java程序猿JavaScript学习笔记(14——扩大jQuery UI)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

随机推荐

  1. Linux下Tomcat 8080 端口被占用的解决办法

    希望可以帮助你们 一,停止tomcat 并执行#netstat -an|grep 8080   查看发现有许多80端口进程在里面 二,执行# lsof -i :8080|grep -v "P ...

  2. Memcached 测试

    Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中. 如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用. 语法: s ...

  3. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  4. windows和linux中换行符的转换

    数据开发平台使用上传脚本报错:保存失败,文件编码格式不正确,请修改文件换行符为Unix终束符! 修改方式:DOS系统下,使用文本编译器另存为,然后选择换行符为unix终束符. 解释: windows ...

  5. IIS6.0应用程序池回收(转载)

    这段时间公司的程序经常出现问题,然后整个应用程序就不能访问了,我们的服务器版本:window 2003 SP1,IIS6.0,没有安装Microsoft Visual Studio .NET . 问题 ...

  6. Exif.js获取图片的详细信息(苹果手机移动端上传图片旋转90度)

    Exif.js插件介绍 http://code.ciaoca.com/javascript/exif-js/ iOS手机竖着拍的照片经过前端处理之后被旋转了90°的原因以及解决方案 https://w ...

  7. 安装gstreamer开发环境

    ubuntu中安装gstreamer开发环境: * 安装gstreamer基本库,工具,以及插件 sudo apt--dev gstreamer-tools gstreamer0.-tools gst ...

  8. 使用Nginx Lua实现redis高性能http接口

    使用Nginx Lua实现redis高性能http接口 时间 -- :: 峰云就她了 原文 http://xiaorui.cc/2015/01/27/使用nginx-lua实现redis高性能http ...

  9. iOS 11确认将完全停止支持 32 位应用

    苹果正在逐渐淘汰 32 位应用,而且会在今年秋天完成.根据知名开发者 Steven Troughton-Smith 透露,苹果会在 iOS 11 发布后,停止支持 32 位应用.这意味着 App St ...

  10. 关于Tensorflow 的数据读取环节

    Tensorflow读取数据的一般方式有下面3种: preloaded直接创建变量:在tensorflow定义图的过程中,创建常量或变量来存储数据 feed:在运行程序时,通过feed_dict传入数 ...