函数和原型 (function & prototype)
每一个函数都有一个属性 prototype,表示 "原型对象"
在 JS 中对象的产生是通过原型对象而来,每一个对象,都有一个原型对象。而原型对象上面也有一个自己的原型对象,一层一层向上找,最终会到达 null
对象和隐式原型 (object & __ proto __)
每一个实例对象都有一个 __ proto __ 属性称为 隐式原型,指向创建该对象的构造函数的 prototype
。这个属性本身也是对象。
-
函数的属性
prototype
-
对象的属性
__proto__
let arr = [];
console.log(arr.__proto__);
console.log(Array.prototype);
console.log(arr.__proto__ == Array.prototype); // true
原型和隐式原型 (prototype & __ proto __)
每个对象身上的 __ proto __属性都指向创建该对象的函数的prototype
console.log(arr.__proto__ === Array.prototype); // true
原型和构造器(prototype & constructor)
每一个函数的 prototype 上有 constructor 属性,指向原型所在的类。
原型链 (prototype chain)
找公用的属性。方法属于特殊的属性,属性所对应的值是一个函数。
原型链:从实例本身 --> 创建该实例对象的构造函数原型 --> Object.prototype
-
本质上来说,所有 function 都可以看作是由
new Function()
生成的,所有通过new Function()
创建的对象叫做 函数对象。 -
所有对象都是由函数对象创建的。
-
函数属于对象,函数可以创建对象。
函数和对象间的关系(function & obj)
instanceof
用于判断一个对象 是否是 一个构造函数的 实例对象。原理就是利用了原型链。注意,instanceof 只能用于复杂数据类型。
所有对象 instanceof Object 都得到 true,因为 Object 在原型链的上端。
语法:obj instanceof class
function Student(){}
let obj = new Student();
console.log(obj instanceof Student); // true
function Fn() {}
let obj = {};
console.log(obj instanceof Fn); // false
function fn(){}
console.log(fn instanceof Object); // true
console.log(fn instanceof Function); // true
总结
1、原型:每个函数都有一个 prototype 属性叫做原型
2、隐式原型:每个对象都有一个 proto 属性叫做隐式原型
3、所有对象本质上都可以看作是通过 Object 创建的
4、所有函数本质上都可以看作是通过 Function 创建的
5、判断 obj 是不是一个构造函数的实例对象 xxx.instanceof function