js-es6知识汇总(1) 原型与原型链
js-es6知识汇总(1)原型与原型链
1.面向过程与面向对象
1.1面向过程
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用。
1.2面向对象
- 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作。
1.3面向过程与面向对象对比
面向过程 | 面向对象 | |
---|---|---|
优点 | 性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程。 | 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 |
缺点 | 不易维护、不易复用、不易扩展 | 性能比面向过程低 |
2.对象与类
2.1对象
对象是由属性和方法组成的:是一个无序键值对的集合,指的是一个具体的事物
- 属性:事物的特征,在对象中用属性来表示(常用名词)
- 方法:事物的行为,在对象中用方法来表示(常用动词)
2.1.1创建对象
//字面量创建对象
var ldh = {name: '刘德华',age: 18
}
console.log(ldh);//构造函数创建对象function Star(name, age) {this.name = name;this.age = age;}
var ldh = new Star('刘德华', 18)//实例化对象
console.log(ldh);
如上两行代码运行结果为:
2.2类
- 在 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后以这个类来实例化对象。类抽象了对象的公共部分,它泛指某一大类(class)对象特指某一个,通过类实例化一个具体的对象
2.2.1创建类
- 语法:
//步骤1 使用class关键字
class name {// class body
}
//步骤2使用定义的类创建实例 注意new关键字
var xx = new name();
- 示例
// 1. 创建类 class 创建一个 明星类class Star {// 类的共有属性放到 constructor 里面constructor(name, age) {this.name = name;this.age = age;}}// 2. 利用类创建对象 newvar ldh = new Star('刘德华', 18);console.log(ldh);
以上代码运行结果:
运行结果和使用构造函数方式一样
2.2.2类创建添加属性和方法
// 1. 创建类 class 创建一个类
class Star {// 类的共有属性放到 constructor 里面 constructor是 构造器或者构造函数constructor(uname, age) {this.uname = uname;this.age = age;}//------------------------------------------->注意,方法与方法之间不需要添加逗号sing(song) {console.log(this.uname + '唱' + song);}
}
// 2. 利用类创建对象 new
var ldh = new Star('刘德华', 18);
console.log(ldh); // Star {uname: "刘德华", age: 18}
ldh.sing('冰雨'); // 刘德华唱冰雨
以上代码运行结果:
注:
- 通过class 关键字创建类, 类名习惯首字母大写
- 类里面有个constructor 函数,可以接受传递过来的参数,同时返回实例对象
- constructor 函数 只要 new 生成实例时,就会自动调用这个函数, 如果我们不写这个函数,类也会自动生成这个函数
- 多个函数方法之间不需要添加逗号分隔
- 生成实例 new 不能省略
- 语法规范, 创建类 类名后面不要加小括号,生成实例 类名后面加小括号, 构造函数不需要加function
2.2.3类的继承
- 语法
// 父类
class Father{
} // 子类继承父类
class Son extends Father {
}
- 示例
class Father {constructor(surname) {this.surname= surname;}say() {console.log('你的姓是' + this.surname);}
}class Son extends Father{ // 这样子类就继承了父类的属性和方法
}
var damao= new Son('刘');
damao.say(); //结果为 你的姓是刘
以上代码运行结果:
子类使用super关键字访问父类的方法
//定义了父类
class Father {constructor(x, y) {this.x = x;this.y = y;}sum() {console.log(this.x + this.y);}}
//子元素继承父类class Son extends Father {constructor(x, y) {super(x, y); //使用super调用了父类中的构造函数}}var son = new Son(1, 2);son.sum(); //结果为3
注意:
继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)
如果子类想要继承父类的方法,同时在自己内部扩展自己的方法,利用super 调用父类的构造函数,super 必须在子类this之前调用
// 父类有加法方法class Father {constructor(x, y) {this.x = x;this.y = y;}sum() {console.log(this.x + this.y);}}// 子类继承父类加法方法 同时 扩展减法方法class Son extends Father {constructor(x, y) {// 利用super 调用父类的构造函数 super 必须在子类this之前调用,放到this之后会报错super(x, y);this.x = x;this.y = y;}subtract() {console.log(this.x - this.y);} } var son = new Son(5, 3); son.subtract(); //2 son.sum();//8
时刻注意this的指向问题,类里面的共有的属性和方法一定要加this使用.
- constructor中的this指向的是new出来的实例对象
- 自定义的方法,一般也指向的new出来的实例对象
- 绑定事件之后this指向的就是触发事件的事件源
在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象
3.构造函数
构造函数方法很好用,但是存在浪费内存的问题。
3.1构造函数原型prototype
构造函数通过原型分配的函数是所有对象所共享的。
在JavaScript中,每个构造函数都有一个prototype属性,这个属性指向函数的原型对象。
我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法。
function Person(age) {this.age = age
}
Person.prototype.name = 'kavin'
var person1 = new Person()
var person2 = new Person()
console.log(person1.name) //kavin
console.log(person2.name) //kavin
//preson1,2实例均采用构造函数原型的方法
上述例子中,Person.prototype.name = ‘kavin’ 函数的prototype指向了一个对象,而这个对象正是调用构造函数时创建的实例的原型,也就是person1和person2的原型。
3.2对象原型
对象都会有一个属性 __proto__ 指向构造函数的 prototype 原型对象,之所以我们对象可以使用构造函数 prototype 原型对象的属性和方法,就是因为对象有 __proto__ 原型的存在。
__proto__对象原型和原型对象 prototype 是等价的
__proto__对象原型的意义就在于为对象的查找机制提供一个方向,或者说一条路线,但是它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象 prototype
function Person() {}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true
3.3 constructor
每个原型都有一个constructor属性,指向该关联的构造函数。
constructor 我们称为构造函数,因为它指回构造函数本身。
constructor 主要记录对象引用的是哪个构造函数
例子:
如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数如:
function Star(uname, age) {this.uname = uname;this.age = age;}// 很多情况下,我们需要手动的利用constructor 这个属性指回 原来的构造函数Star.prototype = {// 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数constructor: Star, // 手动设置指回原来的构造函数sing: function() {console.log('我会唱歌');},movie: function() {console.log('我会演电影');}
}
var zxy = new Star('张学友', 19);
console.log(zxy)
function Person() {}
console.log(Person===Person.prototype.constructor) //true
3.4原型链
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链的基本概念。——摘自《javascript高级程序设计》
即:实例的原型 原型的原型 原型的原型…从而形成原型链
通俗理解:找实例的属性 找不到就会往原型找 直到找到最顶层(null)
js-es6知识汇总(1) 原型与原型链相关推荐
- 【汇总】JS高级知识汇总
文章目录 前言 1.浏览器工作原理和V8引擎 2.JavaScript函数执行.作用域链以及内存管理 3.底层剖析JavaScript闭包执行以及内存模型.内存泄露 4.this的四个绑定规则及其细节 ...
- js基础知识温习:构造函数与原型
构造函数 构造函数主要用于初始化新对象.按照惯例,构造函数名第一个字母都要大写. 构造函数有别于其它函数在于它使用new操作符来调用生成一个实例对象.换句话说,如果一个函数使用new操作符来调用,则将 ...
- js 正则知识汇总(转)
// 短日期,形如 (2003-12-05) function strDateTime(str) { var r = str.match(/^(d)(-│/)(d)2(d)$/); if(r==n ...
- html css js知识整理,Html+Css+Js实用知识汇总(持续更新中...)
Html篇 基本概念: html:超文本标记语言(Hyper Text Markup Language) html5:下一代的html xhtml:更严谨更纯净的html 表头 网站标题 //页面编码 ...
- (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】
JS基础知识二(原型和原型链) 提问 class 继承 类型判断(instanceof) 原型 原型关系 基于原型的执行规则 原型链 说明 提问 如何准确判断一个变量是不是数组 class的原型本质 ...
- 最详细的讲解 JS 原型与原型链
文章目录 一. 普通对象与函数对象 二. 构造函数 三. 原型对象 四. proto 五. 构造器 六. 原型链 七. Prototype 总结 一. 普通对象与函数对象 JavaScript 中,万 ...
- js原型和原型链_初识JS原型/原型链/原型继承
本文思路: 原型->原型链->原型继承->基于原型的继承/ES6中的继承->__proto__与prototype 首先我们知道JS中有对象,比如: var 但是在我们没有对这 ...
- 最详尽的 JS 原型与原型链终极详解(1)(2)(3)===转载
转载===方便以后复习 原文网址:https://www.jianshu.com/p/dee9f8b14771 一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为 ...
- js三座大山——原型及原型链
前言 js的三座大山(原型及原型链.作用域及闭包,异步执行机制及单线程),一直是前端学习和面试中常常遇到的话题,所以深入学习这一块的知识还是很有必要的,下面详细讲解一下我对这一块的理解,记录一下学习过 ...
最新文章
- scanner怎样回到文件开头_怎么申请专利?个人怎样申请国家专利?
- python散点图拟合曲线-python散点图拟合
- LiveVideoStackCon讲师热身分享 ( 十二 ) —— 微博短视频高并发架构
- Flutter代码锦囊---切换时页面保持状态
- Atitt php script lan debug bp 最佳实践调试php目录1.1. Error_log 11.2. Echo vs log法 11.3. 输出与debug信息昏药问题
- 史上超强最常用SQL语句大全
- 微信小程序轮播图常用炫酷样式----swiper
- mysql全量备份脚本_mysql全量备份脚本
- 手把手教您:iOS 6.1~6.12 完美越狱教程
- 目前国内的跨境收款通道有哪些还不错的?
- Pandas快乐学习之上海机动车牌照拍卖
- Praat脚本-004 | 替换标注内容
- 云服务器虚拟化搭建,虚拟化搭建云服务器
- oracle 查询去年同期,问个算去年同期值的sql,该怎么处理
- Redis设计与实现学习记录《一》
- 计算机信息与科学学院青协,武汉东湖学院计算机科学学院青年志愿者协会
- 矩阵三角分解法(LU分解)
- 数据权限设计:从RBAC到ABAC的演变
- 我的二十条择偶标准 [转]
- RS232 485 CAN端口浪涌、脉冲保护电路