原型链
每个对象都可以有一个原型proto,这个原型还可以有它自己的原型,以此类推,形成一个原型链。查找特定属性的时候,我们先去这个对象里去找,如果没有的话就去它的原型对象里面去,如果还是没有的话再去向原型对象的原型对象里去寻找...... 这个操作被委托在整个原型链上,这个就是我们说的原型链了。
prototype:
prototype属性,它是函数所独有的,它是从一个函数指向一个对象。它的含义是函数的原型对象,也就是这个函数(其实所有函数都可以作为构造函数)所创建的实例的原型对象; 这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象);
proto:
proto 是原型链查询中实际用到的,它总是指向 prototype,换句话说就是指向构造函数的原型对象,它是对象独有的。注意,为什么Foo构造也有这个属性呢,因为再js的宇宙里万物皆对象,包括函数;
代码解释
var Person=function (name) {
this.name=name;
}
Person.prototype.head=1;
Person.prototype.eyes=2;
Person.prototype.speak=function () {
alert("我是人,我的名字是:"+this.name);
}
Person.speak=function () {
alert("我是人,我的名字是:"+this.name);
}
var p1=new Person("许嵩");
var p2=new Person("孙燕姿");
p1.age=32;
p1.sex='female';
总结
prototype相当于一个大类的制作方法(地址),proto相当于实例去访问制作模板的指针,所以实例都有proto
而Function 虽然是Object制造出来的,因为Function.prototype.proto === Object.prototype
但这两种类型是独立的
JavaScript引擎是个工厂。最初,工厂做了一个最原始的产品原型。这个原型叫Object.prototype,本质上就是一组无序key-value存储({})之后,工厂在Object.prototype的基础上,研发出了可以保存一段“指令”并“生产产品”的原型产品,叫函数。起名为Function.prototype,本质上就是[Function: Empty](空函数)为了规模化生产,工厂在函数的基础上,生产出了两个构造器:生产函数的构造器叫Function,生产kv存储的构造器叫Object。你在工厂定制了一个产品,工厂根据Object.prototype给你做了一个Foo.prototype。然后工厂发现你定制的产品很不错。就在Function.prototype的基础上做了一个Foo的构造器,叫Foo。工厂在每个产品上打了个标签proto,以标明这个产品是从哪个原型生产的。为原型打了个标签constructor,标明哪个构造器可以依照这个原型生产产品。为构造器打了标签prototype,标明这个构造器可以从哪个原型生产产品。所以,我觉得先有Function还是Object,就看工厂先造谁了。其实先做哪个都无所谓。因为在你定制之前,他们都做好了
网友评论