JS原型链html
emmmmm,我为了写这篇博客,看了很多别人写的有关于原型链的介绍,我发现了最重要的点数组
例子详解:浏览器
achieve(){ function Father(){ this.property = true; } console.dir(Father) Father.prototype.getFatherValue = function(){ return this.property; } function Son(){ this.sonProperty = false; } //继承 Father Son.prototype = new Father(); //Son.prototype被重写,致使Son.prototype.constructor也一同被重写 Son.prototype.getSonVaule = function(){ return this.sonProperty; } var instance = new Son(); console.log(instance) console.log(instance.sonProperty) //false console.log(instance.getFatherValue()) //true alert(instance.getFatherValue()); //true // instance实例经过原型链找到了Father原型中的getFatherValue方法. },
由于不是很懂,我给每一个地方都打印了一下,详解见下图~函数
再次打印~~~this
儿子Son同理 而后就是儿子继承了本身的父亲,在儿子继承父亲class的时候,子类的__proto__ 属性指向父类,子类的原型__proto__,也老是指向父类的prototype属性,ES6中的class继承多了一个Object.setPrototypeOf(Child, Parent) 的步骤,即 Child.__proto__ = Parent
。spa
可是呢,儿子在继承父类的时候,本身的son.prototype被重写,致使了son.prototype.constructor也被重写了prototype
最后打印结果指针
这基本上就是走了一个流程图 instance实例经过原型链找到了Father原型中的getFatherValue方法.code
总结以下: htm
var 对象 = new 函数() var instance = new Son()
对象.__proto__ === 对象的构造函数.prototype instance.__proto__ === Son.prototype
Son 的原型对象是 Function 即 Son是Function的实例 那么 Son.__proto__ == Function.prototype
__proto__属性:在这个万物皆对象的年代,每个对象都有属性__proto__,这个对象会指向对象的原型
prototype属性:万物皆对象,万物中固然也包括函数,函数也是一个对象,并且函数除了拥有__proto__属性外,另外还有一个prototype属性,这个函数的prototype属性指向了一个对象,而这个对象是窎远构造函数而建立的实例的原型,他通常生活在咱们的继承中
在我认为的二者之间的区别,显而易见的就是 prototype是函数的内置属性,_ proto_ 是对象的内置属性,另外附上一个规则
1..全部的引用类型(数组、对象、函数)都具备对象特性,便可自由扩展属性(除了“null”)
2..全部的引用类型(数组、对象、函数)都有一个 _proto_ 属性(隐式原型属性),属性值是一个普通的对象
3..全部的函数,都有一个 prototype(显式原型)属性,属性值也是一个普通的对象
4..全部的引用类型(数组、对象、函数), _proto_ 属性值(隐式原型属性)指向它的构造函数的“prototype”属性值,当试图获得一个对象的某个属性时,若是这个对象自己没有这个属性,那么会去它的_proto_(即它的构造函数的 prototype(显式原型))中寻找
this 是个啥?
1.谁最终调用函数,this指向谁。
①this指向的永远只多是对象!!!
②this指向谁永远不取决于this写在哪,而是取决于函数在哪调用
③this指向的对象,称之为函数的上下文context,也叫函数的调用者
2.this指向的规律(与函数调用的方式息息相关):
this指向的状况,取决于函数调用方式有哪些,
①经过函数名()直接调用:this指向window =>>>>> function func(){
}
②经过对象.函数名()调用的:this指向这个对象 =>>>>>func();
③函数经过数组的一个元素,经过数组下标调用的,this指向这个数组 var
arr=[func,1,2,3];
arr[0]();
④函数做为window内置函数的回调函数调用时,this指向window如setTimeout setInterval 等 setTimeout(func,1000);
⑤函数做为构造函数用new关键字调用时,this指向新new出的对象。 var
obj =
new
func();