一.原型链
在介绍原型链之前,先记住两个概念:①创建一个对象,这个对象一定会有一个_proto_属性,这个对象的__proto__属性指向构造该对象的构造函数的原型。②函数也是一种特殊的对象,所以函数也有__proto__属性,还有自己的原型属性prototype.函数的原型对象不断向上寻找的时候,也能读取到obj.prototype.
这里引用到了dovlie的一些图和例子
这里创建一个普通对象
var obj1{ x:1,y:2}
- 原型链的继承
我们也用图例来演示
var y=function(){}
var x=new fn()
版权声明:本文为优快云博主「dovlie」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/dovlie/article/details/76228994
所以我理解的原型链的定义是这样的:
- 引用数据都有自己的原型对象,而原型对象也有原型对象,直到最顶层为null,是通过一层层指向最终找到null(也是一个对象类型),像链子一样把原型对象链起来所以叫原型链
- 一个对象访问数据时只能在自己的原型链上不断深入访问,不能跨链访问.
- 所有引用数据的祖先数据都是Object.prototype指向的对象
function fn () {
this.name1="karen"
}
fn.prototype=function() {
this.money=100
}//当使用new调用fn这个函数时,创建的对象的原型对象就是等号后面的函数
var f1=new fn()//这里相当于{name:"karen",__proto__:function(){this.money=100}}
var f2=new fn()
console.log(f1.__proto__.prototype)
console.log(f2.__proto__)
console.log(f2.__proto__===f1.__proto__)//true 所以f1,f2的原型对象是一个东西
这里注意一个细节
①f1.__proto__={color:white}
②f1.__proto__.color="white";//这两行代码是有区别的,①的代码color:"white"这个属性只有f1.__proto__.color中能访问到,而②写法f2.__proto__.color也能访问到;
我的理解是①在添加color这个属性时在f1的原型链指向,f2不能跨链访问,
而②写法它先找到f1的__proto__属性,给这个对象里添加了一个属性,因为f1,f2的__proto__是同一个东西,所以f2也能访问的到
二.作用域(拓展)
-
在这里记住三句话
1:函数里面可以访问外面
2:函数外面不能访问里面
3:函数代码的执行,是在函数声明的作用域下执行,不是在调用的作用域下执行
var a=20
function fn () {
var a=30
return function fm () {console.log(a)}
}
var re=fn()
// console.log(re)
re()//30
console.log(a)//20
- 这里还有一个知识点:
同一个作用域内有相同的标识符:
1.变量声明
2.形参声明
3.形参赋值(实参给形参上数据)
4.函数声明
(所以打印的时候函数的优先级>形参赋值优先级>形参声明优先级>变量声明优先级>)
function fn (a) {
//先声明变量 var a
//声明形参var a
//给形参赋值a=1
//声明函数:fun a
console.log(a)//所以fun a覆盖了上面的值,所以这里打印fun a
var a=2
function a () {
}
console.log(a)//这里由于fun a被提前到了var a=2前面,所以var a=2相当于最后执行,所以这里打印2
}
fn(1)//结果为:function a () {
}
2