原型基础

  1. 每个函数都有一个prototype属性,指向函数的原型对象
  2. 每个对象都一个私有属性 __proto__, 默认指向其构造函数的prototype
  3. 在JS中所有函数都是Function构造出来的一种特殊对象,包括Function本身;因此所有函数的__proto__,指向Function.prototype
  4. 除函数外的所有对象都是由Object构造的,函数的原型对象也是;所以其__proto__ 指向Object.protptype。但Object这个函数的原型对象比较特殊,其__proto__指向null

通过以上,我们可以推出,以下几个表达式的结果都是true

function Car () {}
c1 = new Car() /** 对象的__proto__指向构造函数的prototype */
c1.__proto__ === Car.prototype /** 函数的__proto__指向Function的prototype */
Car.__proto__ === Function.prototype
Object.__proto__ === Function.prototype
Function.__proto__ === Function.prototype /** 原型对象的__proto__指向Object.prototype */
Car.prototype.__proto__ === Object.prototype
Function.prototype.__proto__ === Object.prototype /** Object这个构造函数的原型对象,的__proto__指向null */
Object.prototype.__proto__ === null

__proto__是一个非标准的,但是很多浏览器都实现了的属性,在新的语言标准中,用Object.get/setPrototypeOf() 代替对象的获取/赋值操作

由于现代的的JS引擎后优化属性访问,如更改对象原型,会拖慢新性能,所以通常不建议更改原型,而是直接在函数创建时,就定义好原型

Object.create(proto, propertyObject)

function Car() {}

Car.prototype.say = function () {console.log('hello')}

const customCar = Object.create(Car.prototype, {
name: { value: 'carname1', writable:true },
price: {
get: ()=> 10,
set: () => {}
}
})

原型链

当操作对象的属性时,如果在其自身找不到,就会去其原型对象 __proto__找, 如果还没有找到,就会去原型对象的原型对象上找,直至找到,或者到达Object.prototype

这就是JS的原型链机制。

有了原型链机制,对象就可以直接访问原型链上的所有属性,因此在JS中对象的属性可以分为 自身属性和原型属性两种

继承

说白了继承就是,一个对象拥有(继承)了另一个对象的所有方法和属性,通过原型链机制,可以很方便在JS中实现继承

1、直接操作实例对象的 obj.__proto__,指向另一个原型对象,支持非微软版本浏览器,IE11+,且只能设置对象为原型

2、直接操作构造函数的prototype,指向一个实例对象, 兼容性最好

3、用Object.create() 创建对象,创建时就指定好对象的原型: 兼容IE9+,且可以一次性处理好原型,有助于优化,还可以设置null

4、用set/getPrototypeof,支持IE9+,能够灵活的设置原型,还可以设置null

白话JavaScript原型链和继承的更多相关文章

  1. JavaScript原型链与继承

    最近学习了<Javascript高级程序设计>面向对象部分,结合书中的例子总结一下原型链和继承部分的内容. 创建对象 在Js当中没有类这个概念,当我们想要创建具有相同属性的对象的时候,有如 ...

  2. JavaScript原型链和继承

    1.概念 JavaScript并不提供一个class的实现,在ES6中提供class关键字,但是这个只是一个语法糖,JavaScript仍然是基于原型的.JavaScript只有一种结构:对象.每个对 ...

  3. [转]深入javascript——原型链和继承

    在上一篇post中,介绍了原型的概念,了解到在javascript中构造函数.原型对象.实例三个好基友之间的关系:每一个构造函数都有一个“守护神”——原型对象,原型对象心里面也存着一个构造函数的“位置 ...

  4. JavaScript原型链及继承

    在JavaScript中,所有的东西都是对象,但是JavaScript中的面向对象并不是面向类,而是面向原型的,这是与C++.Java等面向对象语言的区别,比较容易混淆,因此把我自己学习的过程记录下来 ...

  5. javascript原型链继承

    一.关于javascript原型的基本概念: prototype属性:每个函数都一个prototype属性,这个属性指向函数的原型对象.原型对象主要用于共享实例中所包含的的属性和方法. constru ...

  6. 《JAVASCRIPT高级程序设计》根植于原型链的继承

    继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...

  7. 对Javascript 类、原型链、继承的理解

    一.序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...

  8. JavaScript中的原型链和继承

    理解原型链 在 JavaScript 的世界中,函数是一等公民. 上面这句话在很多地方都看到过.用我自己的话来理解就是:函数既当爹又当妈."当爹"是因为我们用函数去处理各种&quo ...

  9. 三张图搞懂JavaScript的原型对象与原型链 / js继承,各种继承的优缺点(原型链继承,组合继承,寄生组合继承)

    摘自:https://www.cnblogs.com/shuiyi/p/5305435.html 对于新人来说,JavaScript的原型是一个很让人头疼的事情,一来prototype容易与__pro ...

随机推荐

  1. mybatis-generator的使用心得

    之前开发了一个亚健康测评系统,使用的是SSM框架,里面第一次使用到了mybatis-generator逆向代码生成工具,很方便,省去了基本的增删改查的mapper文件及sql的编写,还能避免错误,这里 ...

  2. Windows 11,一个新功能,一场新屠杀

    6月24日,微软正式公布了新一代操作系统:Windows 11.这次的更新距离上一代操作系统Windows 10的发布,隔了有6年之久. 在新一代的操作系统中,包含了这些亮点: 采用了全新的UI设计. ...

  3. vs里颜色显示块怎样显示

    就是这种 vs中选择工具-扩展和更新,搜索Web Essentials,安装就好了. 他会安装很多扩展,我这里只需要css相关的

  4. 三剑客-sed

    1.sed命令概述说明: 字符流编辑工具(行编辑工具) 2.sed命令作用说明: (1)擅长对行进行操作处理 (2)擅长将文件的信息进行修改调整/删除 3.sed具体功能 (1)文件中添加信息的能力( ...

  5. MyBatis:MyBatis-Plus条件构造器EntityWrapper

    EntityWrapper 简介 1. MybatisPlus 通过 EntityWrapper(简称 EW,MybatisPlus 封装的一个查询条件构造器)或者 Condition(与 EW 类似 ...

  6. python 两种排序方法 sort() sorted()

    python中有两种排序方法,list内置sort()方法或者python内置的全局sorted()方法 区别为: sort()方法对list排序会修改list本身,不会返回新list.sort()只 ...

  7. 桌面Linux系统的先驱者慕尼黑现在正在考虑切换回Windows

    From: http://arstechnica.com/business/2014/08/linux-on-the-desktop-pioneer-munich-now-considering-a- ...

  8. 关于hive的基础

    Hive基础 1.引入原因 对存在HDFS上的文件或HBase中的表进行查询时,是要手工写一堆MapReduce代码 对于统计任务,只能由懂MapReduce的程序员才能搞定 事实上,许多底层细节实际 ...

  9. [刘阳Java]_Spring AOP基于XML配置介绍_第9讲

    基于注解配置的Spring AOP固然简单,但是这节我们会给大家介绍基于XML配置的AOP是如何应用的.为什么这么说了,因为后面我们还会介绍到Spring对Dao操作的事务管理(基于AOP的XML文件 ...

  10. WinForm使用DataGridView实现类似Excel表格的查找替换

    在桌面程序开发过程中我们常常使用DataGridView作为数据展示的表格,在表格中我们可能要对数据进行查找或者替换. 其实要实现这个查找替换的功能并不难,记录下实现过程,不一定是最好的方式,但它有用 ...