1.prototype 属性
每个函数都有一个prototype属性,这个属性指向了一个对象,而这个对象正是调用了该构造函数而创建出实例的原型。
2.原型
每个JavaScript对象(null 除外)在创建时就会与之关联的对象。每个对象都会从原型中“继承”属性。
类比的记忆,原型可能更像一个“类”的概念,而产生对象则像是类的“实例”,那么我们产生对象的函数就类似于类的“构造函数”。
PS:需要注意的是,继承意味着复制操作,但是实例原型实际上是为所有的实例对象所共享,所以说,与其说是继承,倒不如说是委托更为恰当。
3.proto
每个JavaScript对象(null除外)都具有的属性,指向该对象的原型。
PS:不同的浏览器对于脚本的暴露程度是不同的,Firefox、Chrome、Safari中这个属性对于开发者是可见的,但是其他的浏览器例如IE则不允许开发者使用脚本语言来访问。
后面我们会说到原型链,其实proto是类似getter/setter的方法obj.__proto=Object.getPrototypeOf(obj);
4.constructor
每个原型具有的属性,可以指向关联该原型的构造函数。
PS:后面我们会说到原型链,你会发现每个实例对象也可以像实例原型一样来访问constructor属性,但是这个属性其实是通过访问原型来达到的。
5.原型链
看到这里,你也许已经大致了解了什么是原型链,这是我们访问一个对象属性的顺序,换句话说当我们访问一个对象自身没有的属性时,我们会通过原型链来访问该实例对象的实例原型来检查这个属性。
PS:所以说我们应该注意原型链的结果,因为过长过深的原型链会让js访问的时间变长,降低脚本运行的性能。
举例:
function Person(){
this.name = "joy";
}
var per = new Person();
alert(per.name);//joy
那么,我们如何通过修改原型链来达到我们需要的想要的原型继承效果呢,实现的方式有点类似
function Person(){...}
function Student(){...}
var person = new Person();
function inherits(Child,Parent){
var F =function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
}
inherits(Student,Person);
PS:这是笔者自身的读书笔记,参考了许多前辈的内容,大家可以去看一看。
廖雪峰网站