原型与原型链

原型与原型链

原型

类 -> 把数据的公共部分抽离出来形成一个模版

prototype (显示原型)是函数才有的属性,这个属性指向一个对象,该对象正是调用该构造函数而创建的实例的原型。指向原型对象箭头函数是没有 prototype 属性的。在最新 ES 规范里,prototype 被定义为:给其它对象提供共享属性的对象prototype 自己也是对象,只是被用以承担某个职能罢了。prototype 描述的是两个对象之间的某种(委托)关系(其中一个,为另一个提供属性访问权限)。每个函数都有一个 prototype 属性,它默认指向一个 Object 空对象(即称为:原型对象)。
每一个 JavaScript 对象( null 除外)都有一个属性,叫 __proto__(隐式原型) ,这个属性指向该对象的原型。指向原型对象, 原型对象其实就是通过 Object 构造函数生成的。它是历史遗留,在某些环境中,比如 Deno,它是不被支持的。所有函数的 __proto__ 指向他们的原型对象。

1
2
3
4
5
6
7
8
9
10
11
12
//学生公共信息
class Student {
constructor(sex,name,major){
this.sex=sex;
this.name=name;
this.major=major;
}
skill(){
console.log("学习"+this.major);
}
}
let student = new Student('男','张三','CS')

image-20230322155459138

原型链

原型链->模拟类->实现了面向对象编程思路,从而实现类继承
理解原型链:

  1. 理解new关键字的作用机制 写
  2. 理解[[GET]] 读
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    //new 普通函数对象
    function foo(){
    console.log(1)
    return undefined
    }
    //1.执行前 2.执行
    // new 的流程
    // 执行前:
    // 1.绑定this为空对象
    // 2.让空对象的[[Prototype]](__proto__)->函数的prototype属性 => this.__prototype=foo.prototype
    // 3.正常执行函数
    // 4.如果函数返回的是基本类型,就返回this的值,否则返回原函数的返回值
    // (1).所有对象都有隐式属性[[Prototype]](__proto__),所有的对象本身都是new出来的
    // (2).所有的函数对象-> prototype 显式属性
    foo.prototype
    var a = new foo() //构造函数
    //Object.prototype.__proto__=null 原型链的终点
    //Function.prototype.__proto__=Object.protype
    //Object.__proto__=Function.prototype
    //Function.__proto__=Function.prototype

补充

js本身不是传统意义上的面向对象语言
如何得到没有任何属性的对象

1
2
var o = Object.create(null);
console.log(o);

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!