@Secretmm
2020-03-13T08:44:03.000000Z
字数 1766
阅读 970
js专题
文章推荐
原型的作用?
所有的对象都可以是原型对象?
typeof(Array); //functiontypeof(Number); //functiontypeof(String); //functiontypeof(Boolean); //functiontypeof(Object); /fFunction//以上都是由构造函数构造出来typeof(function a() {}); //functiontypeof(new Function()); //functionfunction a() {};typeof(a);//functionvar b = function() {}typeof(b);//function
初始化一个对象
eg:
function BaseInfo() {this.name = [];this.info = function() {}}var baseone = new BaseInfo();baseone.name = ['zs'];baseone.info = {};var basetwo = new BaseInfo();console.log(basetwo.name) // []
//等同于es6class BaseInfoa {constructor() {this.name = [];this.info = function() {}}}
修改baseone中name的值,basetwo中name的值仍为BaseInfo中的初始值,而数组和函数都属于对象,是引用类型,既然baseone和basetwo中的值不相等,证明它们不是同一个引用,而是对BaseInfo对象定义的属性和方法的一个复制;
这个对属性来说没有什么问题,但是对于方法来说问题就很大了,因为方法都是在做完全一样的功能,但是却又两份复制,如果一个函数对象有上千个实例,那么它的每个实例都要保持一份上千个方法的复制,这会占用极大的内存,这可肿么办呢,prototype应运而生。
基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法,每个构造函数都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(proto)。
每个函数对象并且只有函数对象有prototype属性,我们可以在prototype中放入公有的属性,用于这个函数下面实例的继承。
eg:将上例改成
function BaseInfo() {this.name = [];}BaseInfo.prototype.info = function() {};\\或者BaseInfo.prototype = {info: function() {},}
_proto_在js中,每一个对象都有一个原型对象[xx.prototype],并且每一个对象都有一个原型指针_proto_来指向它的原型对象;通过_proto_可以访问到它所继承的原型对象的属性;
如图所示:

var f1 = new Foo();f1._proto_ === Foo.prototype; //true
var a = new Array();a.__proto__ === Array.prototype // true //a本身没有prototype
在js中,每个对象都有它的构造函数,对象中有一个constructor属性指向该对象的构造函数;而函数对象的prototype中也有一个constructor,它指向构造函数本身;
f1.constructor === Foo //trueFoo.prototype.constructor === Foo //true
放一张大图,能看懂就代表理解啦~

a instanceof B返回一个布尔值,来判断a 是否继承于 B;
eg:上例中:
f1 instanceof Foo //truef1 instanceof Object //true