15-构造函数及原型
一.JSON
js
中的对象只有js
自己认识,其他语言是不认识的,如果需要数据通信怎么办,我们发现至少所有语言都认识数字,字符串,布尔值,所以我们可以将js对象转成字符串
JSON
就是一个特殊格式的字符串,这个字符串可以被任意的语言所识别
并且可以转换为任意语言中的对象,JSON
在开发中主要用来数据交互
1. JSON
JSON
==> JavaScript Object NotationJS
对象表示法JSON
和js
对象的格式一样,只不过JSON
字符串中的属性名必须加双引号var json = '{"name":"wuwei","age":18}'
2. JSON
的分类
对象 {}
var obj = '{"name":"wuwei","age":18}' // 这叫`JSON`对象
数组 []
var arr = '[1,2,3,"hello",true]'; // 这叫`JSON`数组
3. JSON
中允许的值
- 字符串
- 数值
- 布尔值
- null
- 对象(只能是普通对象,不能是函数)
- 数组
4. JSON
的方法(也叫序列化对象)
在js
中,给我们提供了一个工具类,就叫JSON
这个对象可以帮助我们将一个JSON
转换位JS
对象,也可以将一个JS
对象转换为一个JSON
4.1 将JSON
字符串转成js
对象
JSON.parse(json)
var json = '{"name":"wuwei","age":18}';
var o = JSON.parse(json);
console.log(o); // {name: "wuwei", age: 18}
4.2 将js
对象转换为JSON
对象
JSON.stringify(obj)
var obj = {name:"wuwei",age:18};
var json = JSON.stringify(obj);
console.log(json); // '{"name":"wuwei","age":18}'
5. 兼容
JSON
对象在IE 7 及以下,不兼容,会报错JSON
未定义
IE 7 及以下兼容
使用eval ()函数,
这个函数可以用来执行一段字符串形式的JS代码,并将结果返回
如果使用eval()执行的字符串中含有{},{}会被当成代码块
如果不希望{}被当成代码块,则需要在字符串前后各加一个()
var json = '{"name":"wuwei","age":18}';
var obj = eval("("+json+")");
console.log(obj); // {name: "wuwei", age: 18}
在开发中尽量不要使用,因为eval()性能比较低,同时具有安全性问题
如果真的需要兼容IE 7及以下可以引入外部封装json的js文件解决
二. 对象复习
1. 对象的创建
1.1. 字面量方式(也叫直接量)
var obj = {};
1.2 new操作符创建对象
var obj = new Object()
2.对象属性和方法
2.1 对象的属性
对象有属性,所谓的属性就是这个对象的特点、特性
var student = {};
student.sex = '男孩'
2.2 对象的方法
对象只能有属性,只是如果这个属性的值是一个函数,那么这个函数我们就称为对象的“方法”(method)。
student.study = function(){console.log('我学会了语文')
}
三. 构造函数
1. 构造函数的原理
JavaScript规定,一个函数可以用new关键字来调用。那么此时将按顺序发生四件事情:
1)隐秘的创建一个新的空对象
2)将这个函数里面的this绑定到刚才创建隐秘新对象上
3)执行函数体里面的语句
4)返回这个新的对象
例子:
function People(){this.name = "小明";this.age = 18;this.sex = "男";
}
// 使用new关键字来调用函数,那么函数就叫做构造函数,将返回一个对象
var xiaoming = new People();console.log(xiaoming); // People {name: "小明", age: 18, sex: "男"}
console.log(xiaoming.age); //18
好了,也就是说,我们现在学习了函数的new的调用方式:使用new关键字来调用。
厉害了,现在我们发现函数不仅仅能够执行,还能返回出来一个对象。也就是说,对象是函数“生”出来的,对象是函数“new”出来的。
所以我们称呼这个生出对象的函数,叫做构造函数,一般的,构造函数用大写字母开头。也叫作People“类”。
我们称呼xiaoming这个对象是People类的实例。
2. 构造函数类和实例
Person这个函数将被new关键词来调用,所以称为构造函数
我们说,这些返回的对象都有形同的属性群,所以可以看做是一类东西,那么People这个构造函数,也就可以看成类的定义
例子:
function People(name,age,sex){this.name = name;this.age = age;this.sex = sex;
}//new关键字造出来的xiaoming、xiaohong,我们称为People类的实例。可以理解为实体
var xiaoming = new People("小明",20,"男");
var xiaohong = new People("小红",16,"女");console.log(xiaoming);
console.log(xiaohong);
但是但是JavaScript中,没有类的概念。是通过构造函数的4步走机制来创建类似的对象,可以看为类。JS这个语言是“基于对象”(base Object)的语言,不能叫做“面向对象”(orinted object)的语言。
所以我们的构造函数,也可以看成类的定义:
构造函数其实就是一个普通的函数,JS
没有规定函数里写什么,。只不过我们知道new操作符的原理后,就习惯了先用this.’…’ = 来罗列所有属性,然后罗列所有的方法而已。你一定要深刻理解:
new调用一个函数的时候,函数里面的语句会执行。
function People(name,age,sex){this.name = name;this.age = age;this.sex = sex;this.sayHello = function(){alert("你好我是" + this.name + ",nice to meet you");}
}function Dog(name,pinzhong,age,sex){this.name = name;this.pinzhong = pinzhong;this.age = age;this.sex = sex;this.wangwang = function(){alert("汪汪汪汪" + this.name + "汪汪汪汪汪汪");}
}var wuwei = new People("wuwei",11,"男");
xiaoming.sayHello();var xiaobai = new Dog("小白","京巴",2,"公的");
xiaobai.wangwang();
3. 构造函数里面的注意事项
3.1 如果构造函数里没有this,那么将创建一个空对象
//构造函数里面如果没有了this,那么就废了,就不能给隐秘新创建出来的对象添加属性。但是里面的语句能够执行!!所以new出来的就是一个空对象
function People(){for(var i = 1 , sum = 0; i <= 100 ; i++){sum += i;}alert(sum);
}var wuwei = new People();
console.log(xiaoming);
3.2 构造函数构造函数中,不允许出现return语句
出现return语句了,将不能返回新创建的那个对象,而是返回return 语句后面的内容
function People(name,age){this.name = name;this.age = age;return {"a":1,"b":2};
}var wuwei = new People("wuwei",12);
console.log(wuwei);
3.3 JS没有规定构造函数中的语句的规范,想怎么写就怎么写:
// 这就是函数 你想怎么写就怎么写
function People(name,age){this.name = name;this.age = age;// if(this.age >= 18){// this.state = "成年人";// }else{// this.state = "未成年";// }this.state = this.age >= 18 ? "成年人" : "未成年";
}var wuwei = new People("wuwei",11);
alert(wuwei.state);
总结一下
当一个函数用()调用的时候,this就是window
当一个函数用对象调用的时候,this就是这个对象
当一个函数绑定给一个HTML元素事件的时候,this就是这个HTML元素
当一个函数用定时器调用的时候,this就是window
当一个函数用apply、call调用的时候,this就是你指定这个东西
当一个函数用new调用的时候,this就是隐秘创建的空对象,函数里面的语句将被执行,并且返回新对象
面向对象,首先就两个词,构造函数和实例
面向对象就是一种组织代码的方式
四. 原型 prototype
1 原型 prototype
prototype就是英语“原型”的意思。原型是构造函数创建对象的原始模型
原型的特点:
原型也是对象,原型是函数对象的一个属性
原型自带constructor属性, constructor指定构造函数
构造函数创建出的对象会继承原型的属性和方法
// 任何函数都有原型,只是原型对于普通函数没什么大用,但对于构造函数用处极大
function fun(){console.log("您好")
}console.log(fun.prototype);
console.log(typeof fun.prototype);
在JavaScript中,任何一个函数,都有一个prototype属性,指向一个对象。打印prototype属性,你会发现这个属性指向一个空对象。打印prototype的类型,发现是object类型。
2. 原型对象与实例
一个函数的原型,对于普通函数来说,没任何鸟用。但是如果函数是一个构造函数,那么函数的原型,用处极大!
示例:
function People(name,sex,age){this.name = name;this.sex = sex;this.age = age;
}
People.prototype = {hight: 180
}var wuwei = new People("wuwei","男",18);console.log(wuwei.name); // "wuwei"
console.log(wuwei.sex); // "男"
console.log(wuwei.age); // 18
console.log(wuwei.hight); // 180
所以我们甚至可以把所有的属性都加在原型上
// 构造函数
function People(){}//构造函数的原型,我们更改了构造函数的原型,为一个新的对象:
People.prototype = {name : "wuwei",sex : "男",age : 18,hight: 180
}
var wuwei = new People();console.log(wuwei.name); // "小明"
console.log(wuwei.sex); // "男"
console.log(wuwei.age); // 18
console.log(wuwei.hight); // 180
当一个对象被new出来的时候,不仅仅执行了构造函数里面的语句,我们的感觉,构造函数的原型中,所有的属性也加给了这个对象
prototype一定是函数的属性,但这个函数是一个构造函数的时候,那么它new出来的对象,将以他的原型那个对象为new出来的实例的原型对象
3. 实例对象的__proto__
属性
当一个对象被new出来的时候,不仅仅执行了构造函数里面的语句,也会把这个函数的__proto__
指向构造函数的prototype。
// 构造函数
// 构造函数里面没有任何语句,也就是说,这个构造函数在执行的时候,不会给创建出来的对象添加任何属性。
function People(){}//构造函数的原型,我们更改了构造函数的原型,为一个新的对象:
People.prototype = {name : "wuwei",sex : "男",age : 18,hight: 180
}//当一个对象被new出来的时候,不仅仅执行了构造函数里面的语句,也会把这个函数的__proto__指向构造函数的prototype。
var wuwei = new People();//当我们试图访问sex、age属性的时候,身上没有。那么就去查找原型,原型身上有,就当做了自己的属性返回了。
console.log(wuwei.name);
console.log(wuwei.sex); //自己没有,找原型对象
console.log(wuwei.age); //自己没有,找原型对象console.log(wuwei.__proto__);
// {name: "wuwei", sex: "男", age: 18, hight: 180}console.log(wuwei.__proto__ == People.prototype);
// true
注意:
任何一个对象,都有
__proto__
属性,这个属性是Chrome自己的属性,别的浏览器不兼容,但是别的浏览器也有原型对象,只不过不能通过__proto__
进行访问而已。这是属性指向自己的原型对象。
4. 原型的扩展
我们的JavaScript有一个非常牛逼的机制:原型链查找。
当我们试图访问一个对象身上的属性的时候,如果这个对象身上有这个属性,则返回它的值。如果它身上没有这个属性,那么将访问它的原型对象,检测它的原型对象身上是否有这个值,如果有返回它原型对象身上的这个值。
也就是说,我们刚才讲解了2个对象和一个函数的故事。任何一个函数都有原型,原型是一个对象,用prototype来访问。
当这个函数是构造函数的时候,new出来的对象,它们的原型对象就是这个构造函数的原型。
prototype我们称为“原型”,只有函数有原型
__proto__
我们称为“原型对象”,任何对象都有原型对象。
15-构造函数及原型相关推荐
- js面向对象小结(工厂模式,构造函数,原型方法,继承)
本文转至:TJYoung 最近过了一遍尼古拉斯泽卡斯的高级程序设计第三版(红皮书)第六章:面向对象程序设计,现在把总结出来的东西和大家分享一下. 主要内容如下: 1.工厂模式 2.构造函数模式 3.原 ...
- 详解面向对象、构造函数、原型与原型链
详解面向对象.构造函数.原型与原型链 为了帮助大家能够更加直观的学习和了解面向对象,我会用尽量简单易懂的描述来展示面向对象的相关知识.并且也准备了一些实用的例子帮助大家更加快速的掌握面向对象的真谛. ...
- 【进阶5-1期】重新认识构造函数、原型和原型链
引言 前端进阶系列已经到第 5 期啦,本期正式开始原型 Prototype 系列. 本篇文章重点介绍构造函数.原型和原型链相关知识,如果你还不知道 Symbol 是不是构造函数.constructor ...
- 34 JavaScript中的构造函数和原型
技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.概述 在典型的OOP语言中(如Java),都存在类的概念.类就是对象的模板,对象就是类 ...
- javascript面向对象系列第一篇——构造函数和原型对象
前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是 ...
- 深入javascript——构造函数和原型对象
常用的几种对象创建模式 使用new关键字创建 最基础的对象创建方式,无非就是和其他多数语言一样说的一样:没对象,你new一个呀! var gf = new Object(); gf.name = &q ...
- 原型、原型对象、构造函数、原型链理解
1. 基本概念: "原型属性"也可以叫做"原型"(prototype):所有函数都有prototype,我觉得可以理解为python中的类属性,不需要通过实例, ...
- [转]JavaScript构造函数及原型对象
JavaScript中没有类的概念,所以其在对象创建方面与面向对象语言有所不同. JS中对象可以定义为"无序属性的集合".其属性可以包含基本值,对象以及函数.对象实质上就是一组没有 ...
- 构造函数、原型、继承原来这么简单?来吧,深入浅出
构造函数 小编上篇博客中介绍到的通过关键字class方式定义类,然后根据类再创建对象的方式,是ES6中语法,现在很多浏览器对ES6的支持还不是很好,所以也要学习通过构造函数(构建函数)的方式创建对象 ...
- JavaScript高级之构造函数和原型
1.1 概述 在典型的 OOP 的语言中(如 Java),都存在类的概念,类就是对象的模板,对象就是类的实例,但在 ES6之前, JS 中并没用引入类的概念. ES6, 全称 ECMAScript 6 ...
最新文章
- Ubuntu安装Anaconda
- 二叉树中第二小的节点
- 利用json模块解析dict报错找不到attribute 'dumps'[python2.7]
- 【新星计划】MATLAB-字符串处理
- SICStus Prolog 3.10.0正式版下载
- 从一个字符串中剔除连续的字符,只留一个。
- python打印进度条starting...done_python打印进度条-tqdm
- C++中重写与覆写(虚函数virtual)的区别
- 11-图像梯度-Sobel算子
- 计算机控制系统脉冲传递函数,第6.2课 (理解)计算机控制系统理论基础—脉冲传递函数.pdf...
- printstream_Java PrintStream clearError()方法与示例
- Scala中的None,Nothing,Null,Nil
- python中file和open_Python中的file和open简述
- 邮件营销如何“爆增”潜在客户?
- 淘宝/天猫商品优惠券查询API接口,优惠券API接口
- 微信表白神秘代码!快发给ta!(学习资料)
- Android 跨平台技术对比
- Java树状图展示的实现
- 【15.罗马数字转整数】
- 常用Source Insight快捷键
热门文章
- 聊一聊如何把SSL证书安装到小鸟云服务器上
- 鹿先森博客原先森博客(sey.ink)
- java数组 处理函数 chunk_数组分组chunk的一种写法
- 关于NN以及BP的一些网络上整理的资料
- 抗饱和积分器 matlab,抗积分饱和
- vue图片时间轴滑动_vue 写的时间区间拖动控件
- numpy库的函数学习
- 精度和分辨率的区别与理解
- 大数据工程师面临哪些行业机遇与挑战?
- W/View: requestLayout() improperly called by androidapp:id/toolbar_title} during second layout pass: