原型与原型链
原型与原型链
原型
类 -> 把数据的公共部分抽离出来形成一个模版
prototype
(显示原型)是函数才有的属性,这个属性指向一个对象,该对象正是调用该构造函数而创建的实例的原型。指向原型对象。箭头函数是没有 prototype 属性的。在最新 ES 规范里,prototype 被定义为:给其它对象提供共享属性的对象。prototype
自己也是对象,只是被用以承担某个职能罢了。prototype
描述的是两个对象之间的某种(委托)关系(其中一个,为另一个提供属性访问权限)。每个函数都有一个 prototype
属性,它默认指向一个 Object 空对象(即称为:原型对象)。
每一个 JavaScript 对象( null
除外)都有一个属性,叫 __proto__
(隐式原型) ,这个属性指向该对象的原型。指向原型对象, 原型对象其实就是通过 Object 构造函数生成的。它是历史遗留,在某些环境中,比如 Deno,它是不被支持的。所有函数的 __proto__
指向他们的原型对象。
1 |
|
原型链
原型链->模拟类->实现了面向对象编程思路,从而实现类继承
理解原型链:
- 理解new关键字的作用机制 写
- 理解[[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 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!