持续输出js第8篇-(原型prototype和原型链__proto__)

300 阅读1分钟

原型prototype和原型链__proto__

每一个类(函数)都具备prototype,并且属性值是一个对象

该对象上天生具备一个属性:constructor,指向类本身

每一个对象(普通对象、prototype、实例、函数等)都具备:proto,属性值是当前实例所属类的原型

类是函数类型

一道题搞定!

function Fn() {
    this.x = 100;
    this.y = 200;
    this.getX = function () {
        console.log(this.x);
    }
}
Fn.prototype.getX = function () {
    console.log(this.x);
};
Fn.prototype.getY = function () {
    console.log(this.y);
};
let f1 = new Fn;
let f2 = new Fn;
//以下代码注意:点号前面的是谁,方法(getX/getY)里面的this就指向谁
console.log(f1.getX === f2.getX);
console.log(f1.getY === f2.getY);
console.log(f1.__proto__.getY === Fn.prototype.getY);
console.log(f1.__proto__.getX === f2.getX);
console.log(f1.getX === Fn.prototype.getX);
console.log(f1.constructor);
console.log(Fn.prototype.__proto__.constructor);
f1.getX();//点号前面的是谁,方法(getX)里面的this就指向谁
f1.__proto__.getX();
f2.getY();
Fn.prototype.getY();

结果:

false
true
true
false
false
[Function: Fn]
[Function: Object]
100
undefined
200
undefined

注意:

内置类Object的原生代码:用c++写的,length默认为1

如果一个对象不知道它的所属类,那么它的__proto__指向Object(内置类{堆})的原型

Object是基类,它的原型的__proto__指向null

自定义类的type是函数,根上 function

每个函数都是Function这个类的实例,

Object和Function的关系

Object内置类(堆),它本质也是函数,也是Function类的实例

所有实例的原型链指向Function的原型prototype

但是Function的原型不是对象,是函数,该对象的原型链又指向Object的原型prototype

Object._proto_._proto_=Object.prototype

Object是Function的实例,Function也是Object的实例

一个是所有对象的基类,一个是所有函数的基类

类是函数,但是函数也是对象

特殊性,Function的原型不是对象,是函数,之前的版本叫空函数,现在叫匿名函数,虽然它里面啥都没有,但是我们要把它当做普通对象对待