js-高级(原型部分)

一.显式原型和隐式原型

1.标题基本知识点:
1)每个函数都有一个prototype,即显示原型(属性)。
2)每个实例对象都有一个_proto _,即隐式原型。
3)对象的隐式原型的值等于其相应构造函数的显式原型的值。
4)程序员在es6之前,不能直接操作隐式原型,只能操作显式原型。

<script type="text/javascript">
     //定义构造函数
		 function Fn(){ //内部语句: this.prototype={}
		 	
		 }
	//1.每个函数都有一个prototype,即显示原型(属性),默认指向一个空的object对象
		 console.log(Fn.prototype)
	//2.每个实例对象都有一个_proto _,即隐式原型。
	//创建实例对象
		 var fn = new Fn()          //内部语句:this._proto_=Fn.prototype
		 console.log(fn.__proto__)  //fn为实例对象,结果为object
	//3.对象的隐式原型的值等于其相应构造函数的显式原型的值。
		 console.log(Fn.prototype===fn.__proto__) //返回true
	//给原型添加方法
		 Fn.prototype.test = function(){
		 	console.log('test()')
		 }
	//通过实例调用原型的方法
		 fn.test()
		</script>

``
内存结构图如下:
js-高级(原型部分)_第1张图片
2.总结:
1)函数的prototype 属性:属性值是地址值,它在定义函数时自动添加,默认是一个空的object 对象。
2)对象的_proto _属性:属性值是地址值,它在创建对象时自动添加,默认值是构造函数的prototype 属性值。
3)程序员在es6之前,不能直接操作隐式原型,只能操作显式原型。

二. 原型链

1.访问一个对象的属性时:
1)先在自身属性中查找,找回就返回。
2)如果没有找到,再沿着_proto _这条链向上查找,找到则返回。
3)如果最终没有找到,就返回undefined 。
别名 --隐式原型链
作用– 查找对象的属性

2.原型链的图解
js-高级(原型部分)_第2张图片
3.函数的显示原型对象指向的对象默认是空的object实例对象(但object不满足)

console.log(Object.prototype instanceof Object) //false

4.Function是它自身的实例。即所有函数都是Function的实例对象,包括它自身。

console.log(Function.__proto__===Function.prototype) //true

5.Object的原型对象是原型链的尽头。

console.log(Object.prototype.__proto__)  //null

6.原型继承:构造函数的实例对象自动拥有构造函数原型对象的属性。–>利用的就是原型链
7.原型链的属性问题
–>读取对象的属性时:会自动到原型链中查找。
–>设置对象的属性时:不会查找原型链,如果当前对象没有此属性,直接添加此属性并设置其值。
–>方法一般定义在原型中,属性一般通过构造函数定义在对象本身上。

你可能感兴趣的:(js,js原型和原型链)