总结:是个好习惯:
1- 每一个函数,都有一个prototype属性(因为原型的本质是函数??Array 都是函数)
2- 所有通过函数new出来的东西(具体的对象, var arr = new Array(); 这个arr就是),每一个都有一个__proto__指向该函数的prototype
-- prototype(显式原型)
--__proto__(隐式原型)
3- 对象的方法/属性 -- 会从自身出发,沿着原型链(__proto__)去寻找,__proto__类似于链表的指针
4- __proto__是可修改的
对象的__proto__可以被重新赋值
之后可能就会与之前的原型链断开 所继承的方法也就不复存在了
这个是.运算符的实现思路(不是让我们手动去跟着__proto__沿着原型链去找):
1- 去__proto__中找 实际思路就是沿着原型链找某个原型提供了这个方法
2- __proto__有点儿像链表中的指针,指向父级原型的prototype
通过函数(例如Fn)new出来的(例如a), a都有一个__proto__指向Fn的prototype
对象要能够使用某种方法(以.属性的方式使用):
1- 得把这个方法加到这个对象的原型链的某一个原型上
2- 原型的获取可以通过对象的prototype或者__proto__属性来获取
3- 原型获取到后还是一个对象,可以增加一些方法/属性
笔记:
1- fn.prototype === {
constructor: {...} ,// 指向fn本身
__proto__: {...} //
}
所有通过函数new出来的东西,这个东西都有一个__proto__指向这个函数的protyotype:
prototype:(显示)原型
__proto__:隐式原型
当你想要使用一个对象(或者一个数组)的某个功能时,如果该对象本身具有这个功能,则直接使用,如果该对象本身没有这个功能,则去__proto__中找
JS每一个函数都有prototype属性
1.每一个函数,都有一个prototype属性,无论是自定义的,还是系统内置的。都有一个constructor指向它本身。 2.所有通过函数new出来的东西,这个东西都有一个__proto__指向这个函数的prototype,prototype:显式原型,__proto__:(隐式)原型。 3.当你想要使用一个对象(或者一个数组)的某个功能时:如果该对象本身具有这个功能,则直接使用;如果该对象本身没有这个功能,则去__proto__中找。
javascript 三座大山:
1. 原型和原型链
2. 上下文环境和作用域
3. 单线程和异步
1,每一个函数,都有一个prototype属性。
js三大重点知识:原型和原型链 上下文环境和作用域 单线程和异步
函数本身是没有属性的 , 因为它并不是一个对象 , 但是函数的prototype是一个对象 , 可以把属性放在函数的prototype中 , 这就是构造函数 所以Array这个函数可以点出很多方法 , 因为这些方法都是在Array的原型链中定义的
所有的函数都有一个prototype属性它是一个对象 , prototype下面有一个constructor指向函数本身 ,
即 fn === fn.prototype.constructor
所有通过函数new出来的东西都有一个__proto__(隐式原型)指向prototype(显式原型) , 也就是说不管new几个函数, 他们的__proto__都指向构造函数的prototype , 所以构造函数的方法都放在函数的prototype中 , 而不是直接放在构造函数中