(一)JS三座大山——原型与原型链,闭包和异步之原型
1.函数prototype属性(图)
a)每个函数(内置函数,构造函数)都有prototype属性,它默认指向一个空的object对象(即:原型对象)
下面我们举例来看一下:
内置函数(内置函数上有很多自带的方法):
定义好Date函数后,像Date的原型中添加了很多方法
构造函数(默认指向一个空的Object对象,空是指:没有我们自己的)
b)原型对象object中有一个constructor属性,它指向函数对象
我们看一下函数的prototype属性,假设函数名type 它有一个属性叫做prototype,prototype指向type的原型对象,原型对象里面有一个constructor属性,constructor属性又指向type。构造函数type与它的原型对象相互引用。
相互引用: A里面有一个属性可以找到B,B里面有一个属性可以找到A
2.给原型对象object添加属性(一般指方法)====》给实例对象使用,实例对象可以访问
作用:函数的所有实例对象自动拥有原型中的属性(方法)
附录:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>原型</title>
</head>
<body>
<!-- prototype是函数属性,任何函数都有此属性(内置函数,构造函数)
函数的prototype属性默认指向一个空的object对象(原型对象)
原型对象(object)中有一个constructor属性,它指向函数对象
-->
<script type="text/javascript">
// 内置函数
/**Date是Object类型的实例对象
* Object实例对象里面提供了很多方法,
* 这些方法是通过new出来给实例对象使用
* */
console.log(Date.prototype,typeof(Date.prototype));//Object "object"
// 原型对象中有一个属性constructor,它指向函数对象
// Date中的原型Date.prototype
// Date.prototype.constructor原型对象
// constructor引用变量属性
console.log(Date.prototype.constructor===Date);//true
// 构造函数
function fun(){}//空的构造函数
// console.log(fun.prototype);
//Object对象空对象(空是指没有我们自己写的属性)
//给构造函数添加方法 JS 可以动态添加属性
fun.prototype.test = function(){
console.log('test()')
}
//给原型添加属性,怎么使用?
// fun.prototype.test()//如此使用没有意义
console.log(fun.prototype);
// 判断constructor是否指向函数对象
console.log(fun.prototype.constructor===fun)//true
// 创建实例 调用test()
var fun = new fun();
fun.test();
</script>
</body>
</html>