[关闭]
@Secretmm 2020-03-13T08:44:03.000000Z 字数 1766 阅读 866

原型、原型链、继承

js专题


文章推荐
原型的作用?
所有的对象都可以是原型对象?


函数对象

  1. typeof(Array); //function
  2. typeof(Number); //function
  3. typeof(String); //function
  4. typeof(Boolean); //function
  5. typeof(Object); /fFunction
  6. //以上都是由构造函数构造出来
  7. typeof(function a() {}); //function
  8. typeof(new Function()); //function
  9. function a() {};
  10. typeof(a);//function
  11. var b = function() {}
  12. typeof(b);//function

构造函数(挖坑待埋),写一个新篇

初始化一个对象


原型

为什么会有原型

eg:

  1. function BaseInfo() {
  2. this.name = [];
  3. this.info = function() {
  4. }
  5. }
  6. var baseone = new BaseInfo();
  7. baseone.name = ['zs'];
  8. baseone.info = {};
  9. var basetwo = new BaseInfo();
  10. console.log(basetwo.name) // []
  1. //等同于es6
  2. class BaseInfoa {
  3. constructor() {
  4. this.name = [];
  5. this.info = function() {
  6. }
  7. }
  8. }

修改baseone中name的值,basetwo中name的值仍为BaseInfo中的初始值,而数组和函数都属于对象,是引用类型,既然baseone和basetwo中的值不相等,证明它们不是同一个引用,而是对BaseInfo对象定义的属性和方法的一个复制;

这个对属性来说没有什么问题,但是对于方法来说问题就很大了,因为方法都是在做完全一样的功能,但是却又两份复制,如果一个函数对象有上千个实例,那么它的每个实例都要保持一份上千个方法的复制,这会占用极大的内存,这可肿么办呢,prototype应运而生。


原型的作用


原型链

基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法,每个构造函数都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(proto)。

一些基本概念的理解

原型对象prototype

每个函数对象并且只有函数对象有prototype属性,我们可以在prototype中放入公有的属性,用于这个函数下面实例的继承。
eg:将上例改成

  1. function BaseInfo() {
  2. this.name = [];
  3. }
  4. BaseInfo.prototype.info = function() {};
  5. \\或者
  6. BaseInfo.prototype = {
  7. info: function() {},
  8. }

原型指针_proto_

在js中,每一个对象都有一个原型对象[xx.prototype],并且每一个对象都有一个原型指针_proto_来指向它的原型对象;通过_proto_可以访问到它所继承的原型对象的属性;
如图所示:

  1. var f1 = new Foo();
  2. f1._proto_ === Foo.prototype; //true
  1. var a = new Array();
  2. a.__proto__ === Array.prototype // true //a本身没有prototype

constructor属性

在js中,每个对象都有它的构造函数,对象中有一个constructor属性指向该对象的构造函数;而函数对象的prototype中也有一个constructor,它指向构造函数本身;

  1. f1.constructor === Foo //true
  2. Foo.prototype.constructor === Foo //true

放一张大图,能看懂就代表理解啦~


继承

instanceof

a instanceof B返回一个布尔值,来判断a 是否继承于 B;
eg:上例中:

  1. f1 instanceof Foo //true
  2. f1 instanceof Object //true

继承实现教程


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注