JS[原型,原型链,类,继承]探究

js中关于原型、方法相关的内容不同的人理解与记忆的方式各有不一,而官方的说法又是非常难以理解,这里仅记录个人探讨与自己的理解。

首先从数据类型说起

https://editor.csdn.net/md?articleId=106614767

为什么在原型链中最终指向的是基本数据类型null?

null在这里指的是空指针的意思,在js的设计就是如此,让null代表原型链的终点。
原型链是有限长度的,且最终必定都会引用到Object并且指到null为结束

原型与原型链

1.了解普通对象、函数对象、原型对象

参考:https://blog.csdn.net/lxy869718069/article/details/104636429

重要点:3个

  • 函数对象是通过 new Function 创建的对象(内置function),其他的都是普通对象
  • 所有函数对象(除了一些内建函数)都有一个名为prototype(原型)的属性,这个属性是一个指针,指向一个原型对象(显示原型)
  • 所有对象都拥有__proto__属性(隐式原型),但只有函数对象才有 prototype 属性
2.构造函数

理解构造函数本身内容及其结论

function a() {
    
    }
a.prototype.test = function(){
    
    
 console.log('123');
};
let b = new a();
console.log(b.__proto__ === a.prototype); // true
console.log(a === a.prototype.constructor); // true
console.log(a === b.__proto__.constructor ); // true

实例对象与构造函数之间存在一个恒等式:

  • 结论1
    b.proto === a.prototype 即实例对象的隐式原型指向构造函数的显示原型

  • 结论2:
    a === a.prototype.constructor 即每个原型都有一个 constructor 属性指向关联的构造函数,函数对象本身指向该原型的构造函数

  • 结论3:推导结论
    b.proto.constructor = a 即实例对象的隐式原型的constructor 即为a构造函数本身

3.原型、原型链的个人概念

原型是指拥有(prototype)原型属性的函数或者对象
原型链是指多个原型通过__proto__ 属性相互联系起来的链式结构

原型相关的几个重要属性

  1. ​ prototype 存在于函数对象中,他指向了这个函数对象的原型对象
  2. constructor属性存在于原型对象中,他指向了构造函数
  3. 所有对象都拥有__proto__属性,这个属性保存着构建它的原型以及原型链内容

类与继承

es6引入了 Class(类)这个概念。基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已
es6的写法方式:

class Point {
    
    
  constructor(x, y) {
    
    
    this.x = x;
    this.y = y;
  }

  toString() {
    
    
    return '(' + this.x + ', ' + this.y + ')';
  }
}
var p = new Point(1, 2);

es5的写法方式:

function Point(x, y) {
    
    
  this.x = x;
  this.y = y;
}

Point.prototype.toString = function () {
    
    
  return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);

两者是等价的

es6中Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多

猜你喜欢

转载自blog.csdn.net/lxy869718069/article/details/104690986