javascript中的类,继承,构造函数详解
作者:霜叶w 发布时间:2024-07-30 01:08:53
标签:javascript,类,继承,构造函数
前言
在es5中实现一个构造函数,并用new调用,即可得到一个类的实例。到了es6发布了Class的写法,js的面向对象变成也变得比较规范了。聊到类就不能不说类的构造函数以及类如何继承
一、Class类
定义一个类:
class A {
constructor(name){
this.name = name
}
getName(){
return this.name
}
}
var newA = new A("A")
console.log(newA.getName()) // A
二、es5构造函数
在es5中没有Class的写法,想要实现一个类的写法是这样的:
class A {
constructor(name){
this.name = name
}
getName(){
return this.name
}
}
var newA = new A("A")
console.log(newA.getName()) // A
三、实例、类的关系
实例的原型指向类的原型
console.log(newA.__proto__ === A.prototype) // true
关于这个可以了解一下实例化的过程究竟发生了什么,查看MDN的连接:new操作符
创建一个空的简单JavaScript对象(即{});
为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象 ;
将步骤1新创建的对象作为this的上下文 ;
如果该函数没有返回对象,则返回this。
Constructor
console.log(A.prototype.constructor) // Class A
所有的对象都会从原型上继承一个constructor属性,是对函数本身的引用,也就是说指向函数本身。
这里实例newA的原型与A的原型相等,两者的原型的constuctor又都指向A本身。
需要注意的是constrctor是可以被修改的:参照MDN官方实例:constructor
function Type() { };
vartypes = [
new Array,
[],
new Boolean,
true, // remains unchanged
new Date,
new Error,
new Function,
function(){},
Math,
new Number,
1, // remains unchanged
new Object,
{},
new RegExp,
/(?:)/,
new String,
"test" // remains unchanged
];
for(var i = 0; i < types.length; i++) {
types[i].constructor = Type;
types[i] = [ types[i].constructor, types[i] instanceof Type, types[i].toString() ];
};
console.log( types.join("\n") );
只有,true、1、“test”这种只读的原生结构不可被修改constuctor
四、继承
es6继承
class Father{
constructor(name){
this.name = name
}
}
class Son extends Father{
constructor(name,sname){
super(name)
this.sname = sname
}
getSon(){
return this
}
}
var newSon = new Son("f","s")
console.log(newSon.getSon()) // Son {name: 'f', sname: 's'}
es5继承的实现
// 寄生组合继承
function Sub(name){
// 优先执行this绑定,以免覆盖子类的构造的值
// 这里还有一个作用是拷贝了父类属性,避免所有子类共享引用属性!!!!
Person.call(this)
this.name = name || 's'
}
// 复制一份父类的原型,避免修改原型影响其他实例
var fn = function(){}
fn.prototype = Person.prototype
Sub.prototype = new fn()
var sub = new Sub('sub')
sub.showName()
// user extend.html:19
// my name is sub extend.html:21
关于继承详细的可以参考这篇:前端必知必会ES5、ES6的7种继承
来源:https://blog.csdn.net/weixin_44043130/article/details/123147416


猜你喜欢
- 废话不多说了,直接上代码吧!#!/usr/bin/env python# coding=utf-8# 画一棵樱花import turtlei
- 原始生成对抗网络Generative Adversarial Networks GAN包含生成器Generator和判别器Discrimin
- 1、更新包管理 apt-get install update.2、安装 pip3 :apt-get install python3-pip3
- js 代码中经常会碰到 undefined 这种错误,下面本文分享一下为什么会发生这种错误以及如何处理这种错误,js 中如果通过 var 声
- GitHub 可谓各种神器都有,今天发现一个操作数据库的命令行工具,可以自动补全和语法高亮,以前在终端敲 SQL 的时候,你不仅要记住表名、
- python环境 3.6.5 win7 linux环境同理先尝试了PyInstaller ,打包时一直提示 no module named
- 说明:这个例子,首先是把SPAN里的内容用display:none;干掉,就是不显示; 然后在A:HOVER时,再把SPAN里的内容disp
- 一个页面执行一次Sql语句的话,不会影响到性能。如果一个页面要执行很多次Sql语句,而且使用的是同一个数据库连接,那么上面的方法可能会影响到
- 太坑了,安装之前一定要关掉VPN!!!!!!我的python是3.8版本的。第一步:在命令行中输入以下代码安装xarray:conda in
- 准备写一个操作Excel脚本却在导入包的时候出现了一个小问题导入包from Tkinter import Tkfrom time impor
- 处理过滤Apache日志文件access_test.log文件内容27.19.74.143 - - [30/May/2015:17:38:2
- 初级第一次在linux下安装mysql-5.7.19版本教程,如果已经会安装了,那么请看下一篇linux下安装多个mysql-5.7.19环
- 本文译文,采用意译。下面这些方法对于我来说很有作用,自从我发现了这些操作。1. 数组求和假设你有下面的数字数组:let numbers =
- 类和对象类和函数一样都是Python中的对象。当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变量。类是type类
- 在使用pre-train model时候,我们需要restore variables from checkpoint files.经常出现在
- 问题问题1:如何解决事务提交时flush redo log带来的性能损失WAL是实现事务持久性(D)的一个常用技术,基本原理是将事务的修改记
- 循环是我们经常用到的一个概念,比如,循环计算数字叠加、循环输出文字内容等。循环是运行重复内容的一个最简单的方法,简化了代码流程,增加了时效性
- 在Django的开发过程中,有一些功能是通过JS根据用户的不同选择来加载页面中的某一部分(子页面)的。如果子页面中有我们需要传入的值。可以这
- 1、操作步骤(1)打开文件读取整个文件函数open返回一个表示文件的对象,对象存储在infile中。关键字with在不需要访问文件时将其自动
- 如果你的PHP网站换了空间,必定要对Mysql数据库进行转移,一般的转移的方法,是备份再还原,有点繁琐,而且由于数据库版本的不一样会导致数据