从对 js 原型和原型链查找的特性, 我们知道了两个最为重要的结论:

  • 函数对象天生存在 prototype 属性, 它是一个对象, 而它的 constructor 属性指回 函数自身
  • 构造函数的 prototype 属性是 实例对象的原型 , 即 youge.__ proto __ == People.prototype
  • JS 规定实例可以打点访问原型上的属性和方法, 类似类变量或方法, 即称为 原型链查找

原型链的终点

如上例, 构造函数的的原型 People.prototype 并不是原型链的终点, 它往上还有原型是 Object.prototype

那说明与之对应的还有一个 Object 对象, 即为原型链的终点, 简单演示这段关系就是:

// 类似有 2个构造函数, 一个实例:
Object;
People;
youge; // 他们端原型链关系是:
youge.__proto__ = People.prototype
People.prototype.__proto__ = Object.prototype // 最顶端是 Object
Object.prototype 天生存在

还是代码演示吧:

function People(name, age, sex) {
this.name = name
this.age = age
this.sex = sex
} // 实例化
var youge = new People('油哥', 18, '男') // 构造函数的原型, 是 Object.prototype
console.log(youge.__proto__ === People.prototype);
console.log(People.prototype.__proto__ == Object.prototype); // 简写就是
console.log(youge.__proto__.__proto__ == Object.prototype); // 终点就是 Object, 再往上就是 null 啦
console.log(youge.__proto__.__proto__.__proto__ == null);
true
true
true
true

内置的 Object 是所有对象的构造函数, 构造函数的 prototype 是对象, 那它的原型就是 Object . 从原型链的这个关系, 也就解释了为什么一个实例对象能调用类似 hasOwnProperty() 这样的方法, 因为它已经在 Object.prototype 中定义啦. 在调用时如果发现没有, 会沿着原型链往上查找哦, 如果找了终点都没有找到才最终返回 undefined.

不得不说, 这个 JS 创始人的这个独特的原型设计的精妙, 期初觉得很奇怪, 为啥不直接用类, 因为之前接触的语言大多都是面向对象的那一套东西嘛, 现在用了几年突然回首, 呀这个原型设计真的是巧妙至极呀 !

数组的原型链

在 js 中, 数组其实也是对象, 只不过键为索引而已, 它能让我们更加聚焦在值的观测上.

但注意的是, 所有数组的原型是 Array , 则数组的原型三角关系是:

Array -> Array.prototype -> arr.__proto__

而 Array 的原型也是 Object.prototype .

var arr = []

console.log(arr.__proto__ == Array.prototype); // true
// 数组原型链
console.log(arr.__proto__.__proto__ == Object.prototype); // true console.log(Array.prototype.hasOwnProperty('push')); // true
console.log(Array.prototype.hasOwnProperty('splice')); // true console.log(Array.__proto__ == Object.prototype); // false
console.log(Array.__proto__ == Function.prototype); // true

通过原型链实现继承

面向对象三大特性, 封装, 继承, 多态. 那通过原型链呢我们可以实现 继承 的效果.

// 父类
function People(name, age, sex) {
this.name = name
this.age = age
this.sex = sex
} People.prototype.sayHello = function () {
console.log('hi, 我是: ', this.name + '今年: ', this.age, ' 岁啦!');
} People.prototype.eat = function () {
console.log(this.name, "开始吃肉肉.");
} // 子类
function Student(name, age, sex, school, studentNumber) {
// ES6 可以用 super
this.name = name
this.age = age
this.sex = sex
this.school = school
this.studentNumber = studentNumber
} // 关键语句实现继承
Student.prototype = new People() Student.prototype.study = function () {
console.log(this.name, ' 正在学习哦!');
} Student.prototype.exam = function () {
console.log(this.name, ' 正在考试哦!');
} // 实例话
var youge = new Student('youge', 18, '男', '幼儿园', 123456) youge.study() // 能调用父类方法哦, 因为 Student.prototype == new People()
// 子类也能重写父类的 sayHello 方法
youge.sayHello()
youge  正在学习哦!
hi, 我是: youge 今年: 18 岁啦!

发现这个案例, 实现继承的关键一句话是: Student.prototype = new People()

面向对象就简单介绍到这里啦. 总结下来就是, 面向对象的特点是事先对场景进行抽象类, 通过定义不同的类, 再通过类实例话进行程序交互. 它的有点就是可以让程序编写更加清洗, 代码结构更加严密, 使代码更加健壮和方便维护.

但是呢,

我写了一段时间 Java 代码后, 就有点烦这个面向对象了, 写得是真的难受, 感觉还是脚本写起来爽一点呀.

JS 原型链的终点的更多相关文章

  1. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  2. JS 原型链图形详解

    JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...

  3. js原型链+继承 浅析

    名称:    prototype--原型对象    __proto__--属性 原型链与继承网上搜索定义,看起来挺绕的 .先说继承: 所有的对象实例都可以共享原型对象包含的属性和方法  例如一个实例A ...

  4. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  5. js原型链的看法

    原型链 对象 对象: 1,函数对象:由function创造出来的函数 2,普通对象:除开函数对象之外的对象,都是普通对象 **即普通对象obj是构造函数Object的一个实例,因此: obj.__pr ...

  6. JS原型链的理解和使用(一)

    一些个人的理解,不一定是对的,仅供参考. 在JS中有函数和对象两个概念,而又有一切皆对象的概念及函数也是一个对象.所以可以说函数一定可以作为一个对象,而对象不一定是一个函数. 也可以说在js中对象分为 ...

  7. js 原型链详解

    目录 构造函数和实例 属性Prototype 属性__proto__ 访问原型上的方法 构造函数也有__proto__ 构造函数的原型也有__proto__ Object.prototype这个原型对 ...

  8. 更通俗的理解JS原型链

    最近在网上看到一篇理解原型链的,感觉非常好非常通俗易懂,拿来记录一下~: 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他 ...

  9. JS原型链

    JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...

  10. 深入分析JS原型链以及为什么不能在原型链上使用对象

    在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...

随机推荐

  1. JDK8项目简单快速接入AI大模型(无需强制使用JDK17)

    最近AI风头越来越火,好多项目都需要接入AI接口,但Spring-AI强制绑定JDK17这些,导致以前的很多JDK8项目不太方便 找到个办法,使用AI4J来接入 1.本地部署Ollama,这个属于部署 ...

  2. [SDOI2008] 洞穴勘测 题解

    似乎所有的线段树分治题都能被 \(LCT\) 平替掉? 一眼动态树,直接 \(LCT\). Connect x y 操作用 \(link(x,y)\) 实现,Destroy x y 操作用 \(cut ...

  3. [SCOI2016] 幸运数字 题解

    \(xor\) 最大值想到线性基,路径想到 \(lca\) 和树链剖分,由于没有修改用 \(lca\) 就可以.先用处理 \(fa\) 数组的方式处理倍增线性基(自然是得用线性基合并的),在求 \(l ...

  4. 植物大战僵尸杂交版,最新安装包(PC+手机+苹果)+ 修改器+高清工具

    植物大战僵尸杂交版:全新游戏体验与创意碰撞 游戏简介 <植物大战僵尸杂交版>是由B站知名UP主潜艇伟伟迷基于经典游戏<植物大战僵尸>进行的一次大胆且富有创意的二次创作.这款游戏 ...

  5. 甲壳虫ADB助手-让你轻松不用电脑就能卸载电视自带软件

    甲壳虫ADB助手是一款非常使用的安卓ADB调试工具,它适用于各种安卓系统设备,包括手机.平板.手表和电视等等,可以帮助用户直接在手机上对设备进行ADB调试,而且不需要ROOT,支持无线配对连接,让用户 ...

  6. Maven - 项目的JDK编译level是1.5,修改不掉??

    背景   idea中的maven项目,父项目和子项目的Project Structure的language level都是1.5,怎么修改为8?尝试修改并应用后会失效,还是会自动恢复为1.5. 1.S ...

  7. win - [01] 修改网络连接名称(网络1、网络2...网络10)

    修改网络连接的名称 1.打开运行窗口:Windows 键 + R 2.在运行窗口输入 regedit,打开注册表编辑器 3.在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsof ...

  8. 【BUUCTF】easy calc

    [BUUCTF]easy calc (PHP代码审计) 题目来源 收录于:BUUCTF BUUCTF2019 题目描述 一个计算器,尝试SSTI,SQL注入都无果 对计算过程抓包,发现/clac.ph ...

  9. wangeditor编辑器

    官网  https://www.wangeditor.com/ 在线体验DEMO   https://codepen.io/xiaokyo-the-bold/pen/ZEpWByR

  10. Windows 提权-PrintNightmare

    本文通过 Google 翻译 PrintNightmare – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充 ...