JavaScript面向对象编程实现模拟
作者:爱思考的猪 发布时间:2024-07-09 12:51:12
标签:JavaScript,面向对象,OOP
前言
每个对象都是一个功能中心,具有明确分工,可以处理信息,处理信息,发出信息。面向对象编程具有灵活性、可复用性、模块化等好处,适合更多合作完成的大型项目。
1. 构造函数
构造函数的功能是生成对象,生成具有相同结构对象的函数。Java语言通过类实现面向对象,对象是类的实例,而Javascript则是通过构造函数作为对象的模板,使用prototype实现继承。
构造函数的几个特点
构造函数内部使用了this关键字作为被生成的对象
构造函数配合new 操作符使用
构造函数的第一个字符一般大写用来区分普通函数
构造函数默认返回一个新对象(this),如果手动返回值是引用数据类型会覆盖默认的返回值
function Person(name ){
this.name = name;
};
const jack = new Person('jack'); //Person {name: 'jack'}
function Person(name ){
this.name = name;
return name;
};
const jack = new Person('jack'); //Person {name: 'jack'}
function Person(name ){
this.name = name;
return ['jack'];
};
const jack = new Person('jack'); //['jack']
2. new的过程
生成一个新对象绑定给this
将新对象的原型设置为构造函数的prototype属性
执行代码,往this上添加属性
返回this
2.1 基础使用
function Person(name ){
this.name = name;
};
const jack = new Person('jack');
const tom = new Person('tom');
console.log(jack); //Person {name: 'jack'}
console.log(tom); //Person {name: 'tom'}
直接执行构造函数会怎么样?
function Person(){
this.name = name;
};
const jack = Person('jack'); //undefined
构造函数的this指向了window,并没有返回一个对象,我们现在做以下兼容:
function Person(name){
if(!(this instanceof Person)){
return new Person(name);
};
this.name = name;
};
现在可以直接使用了
Person(name); //Object { name: "jack" }
2.2 new.target
在函数内部都可以使用new.target,如果函数是通过new.target调用的则返回被调用的构造函数否则返回undefined
function Person(){
console.log(new.target);
};
new Person(); //function Person(){...}
Person(); //undefined
现在使用new.target进行构造函数的兼容
function Person(name){
if(!(new.target === Person)){
return new Person(name);
};
this.name = name;
};
console.log(Person('jack')); //Object { name: "jack" }
3. 手动实现一个构造函数
function myNew() {
const args = Array.prototype.slice.call(arguments);
const construct = args.shift();
//创建this,并将原型设置为构造函数的prototype
const context = Object.create(construct.prototype);
//执行构造函数,注意这里参数是数组形式所以使用apply
construct.apply(context, args);
//返回
const res = construct();
if ((typeof res === 'object' || res === 'function') && typeof res !== 'null') {
return res;
} {
return context;
}
};
function Person(name, age) {
this.name = name;
this.age = age;
};
const jack = myNew(Person, 'jack', 21);
//Person {name: 'jack', age: 21}
来源:https://blog.csdn.net/qq_44621394/article/details/127102496


猜你喜欢
- 本教程使用的是python 3 和django为事例打开pycharmfile -> new
- 在备份数据库的时候,数据表中可能存在这样的值array('a'='b','c'='d
- Oracle过程和函数相信大家都比较了解,下面就为您详细介绍Oracle过程和函数二者之间的区别,希望可以让您对Oracle过程和函数有更深
- 对象:是抽象的概念 如列表 元组 字典 集合 皆为对象序列化:一种方法。目的:把对象存储在磁盘上(即,将对象转换为字节数据/字符数据)。这一
- 1 数据概览学生课程成绩:studentID、name、english、chinese、math,存在一定缺失值2 任务定义基于学生课程成绩
- django在一个项目的目录结构划分方面缺乏必要的规范,因此不同人的项目组织形式也千奇百怪,而且也很难说谁的做法就比较好。我根据自己的项目组
- time()方法返回时间,在UTC时代以秒表示浮点数。注意:尽管在时间总是返回作为一个浮点数,并不是所有的系统提供时间超过1秒精
- 本文实例讲述了php简单获取复选框值的方法。分享给大家供大家参考,具体如下:html:<form id="form1&quo
- 本文为大家分享了Mysql WorkBench安装配置图文教程,供大家参考,具体内容如下workbench下载地址下载到workbench下
- 一.脚本基础 1.USE语句 &n
- 一、什么是嵌入类型先看如下代码:type user struct { name string &nb
- 应用场景:有时需要测试插入数据库的记录来测试,所以就非常需要用到这些脚本。创建表:CREATE TABLE `tables_a` ( &nb
- split()介绍函数:split()Python中有split()和os.path.split()两个函数,具体作用如下:split():
- 一 程序预览本程序已经写了多年, 很久没用, 不过刚运行了下竟然还可以成功运行. 先来张运行结果图.二 最近的滴滴APP已经可以支持设置自动
- 使Web系统的开发与维护更加方便,从而有效的节省人力物力,受到了越来越多企业的青眯。 模板引擎是MVC模式建立过程的重要方法,开发者可以设计
- 动态生成的IFRAME,设置SRC时的,不同位置带来的影响。以下所说的是在IE7下运行的。IE6下也是同样。在这个blog中,直接点击运行代
- 在《CSS二级菜单》中,如果一级菜单中的超链接是#,那么只要单击该一级菜单,那么与这个一级菜单对应的二级菜单就会一直显示在网页中,不能隐藏,
- 主要讲 except 和 not in 的性能上的区别。 CREATE TABLE tb1(ID int) CREATE TABLE tb2
- 在计算机编程中,数据类型是非常重要的一个概念。数据类型决定了计算机内部如何表示数据,以及在执行不同的操作时需要进行哪些转换。Go 语言作为一
- SESSION会话开启时,会首先发送一个对浏览器的唯一标识session_id的cookie(名字为PHPSESSID可以通过session