我的编程空间,编程开发者的网络收藏夹
学习永远不晚

一起来了解JavaScript面向对象

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

一起来了解JavaScript面向对象

JavaScript原型链

每一个对象都有原型,指向另一个对象,另一个对象也有自己的原型,就这样由原型的原型构成的链条就叫原型链。

image-20210924092335152

原型链的尽头

如果一个原型链是,没用尽头的,那么在查找一原型链上不存在的属性时,就会一直查找下去,存在死循环了。显然不是这样的,那么原型链的尽头是什么?

Object的原型

顶层原型

看代码~


// obj字面量创建方法类似于 new Object()
// 那么 obj对象就是Object的一个实例,也就是说obj.__proto__ === Object.prototype
var obj = {
  name: "fzb",
};
// 那么obj.__proto__ 或者 Oject.prototype 的__proto__ 是什么? 答案是: null
console.log(obj.__proto__); // [Object: null prototype] {}
console.log(obj.__proto__.__proto__); // null

[Object: null prototype] {}的特殊之处:

1、该对象存在原型属性,只是原型指向了null,就是已经是顶层原型了。

2、该对象上还存在许多其他的方法,只是不可枚举,看不到。

创建Object对象的内存图

image-20210924094822274

上方例子的内存图

image-20210924095218150

Object是所有类的父类

原型链最顶层的原型对象就是Object的原型对象

例子:


function Student(sno, name) {
  this.sno = sno;
  this.name = name;
}
const stu = new Student(201801, "fzb");

console.log(stu); // Student { sno: 201801, name: 'fzb' }
console.log(stu.__proto__); // {}
console.log(stu.__proto__.__proto__); // [Object: null prototype] {}

console.log(Student.__proto__); // {}

console.log(Student.__proto__.__proto__); // [Object: null prototype] {}

内存图:

image-20210924101359674

原型链实现继承

继承可以重复利用代码,子类可以使用

例子:


function Person() {
  this.name = "fzb";
}

Person.prototype.running = function () {
  console.log(this.name + "正在跑步~");
};

function Student(sno) {
  this.sno = sno;
}
Student.prototype = new Person();
// 重写整个原型对象之后,要重新配置 constructor
Object.defineProperty(Student.prototype, "constructor", {
  configurable: true,
  enumerable: false,
  writable: true,
  value: Student,
});
Student.prototype.studying = function () {
  console.log(this.name + "正在学习");
};

const stu = new Student(201801);
stu.running(); // fzb正在跑步~
stu.studying(); // fzb正在学习

内存图:

image-20210924105330732

缺陷

1> 在打印子类对象时,有些属性本应该打印出来的,但是因为在父类上,无法打印出来。

2> 多个子类对象在进行某些操作时,会出现相互影响。


// 在上方例子上,加一点点代码,
function Person() {
  this.name = "fzb";
  this.friends = []; // 增加一个属性
}
const stu1 = new Student(201801);
stu1.friends.push("zzw");
const stu2 = new Student(201801);
console.log(stu2.friends); // [ 'zzw' ]
// stu2上取到了stu1的friends属性,这是不可以的

3> 无法传递参数,有些属性存在父类构造函数内,子类实例化时,初始化参数无法传入到父类。

借用构造函数实现继承

在子类构造函数内,调用构造函数。使改变父类构造函数内的this指向,然后父类在this上添加的属性就会在子类实例化的对象上。


function Person(name) {
  this.name = name;
  this.friends = [];
}

Person.prototype.running = function () {
  console.log(this.name + "正在跑步~");
};

function Student(sno, name) {
  Person.call(this, name); // 添加代码
  this.sno = sno;
}
Student.prototype = new Person();
// 重写整个原型对象之后,要重新配置 constructor
Object.defineProperty(Student.prototype, "constructor", {
  configurable: true,
  enumerable: false,
  writable: true,
  value: Student,
});
Student.prototype.studying = function () {
  console.log(this.name + "正在学习");
};

const stu1 = new Student(201801,"stu1");
stu1.friends.push("zzw");
const stu2 = new Student(201802,"stu2");
console.log(stu2.friends); // []

这时原型链实现继承的三个弊端,就解决的。但是又出现了新的缺陷。

缺陷

1> 父类构造函数至少执行了两次以上

2> 子类构造函数的原型对象是父类的实例对象,那么个对象上的属性将会是undefined

image-20210924111324798

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

一起来了解JavaScript面向对象

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python基础:一起来面向对象 (二)

实例 搜索引擎  一个搜索引擎由搜索器、索引器、检索器和用户接口四个部分组成  搜索器就是爬虫(scrawler),爬出的内容送给索引器生成索引(Index)存储在内部数据库。用户通过用户接口发出询问(query),询问解析后送达检索器,检
2023-01-31

一起再看JavaScript中的对象解构

解构是一个概念,分解其中一种数据类型并将其单独的属性分配给变量,在文章《JavaScript 解构赋值 5 个常见场景和实例》中介绍过,今天再来复习一下。
2023-05-14

一文详解Go的面向对象编程

本文主要围绕Golang的Object-oriented所展开,介绍了其基本的面向对象的基本概念及代码实战,有需要的小伙伴跟着小编一起来学习吧
2023-05-18

编程热搜

目录