作用域链: 从上往下
原型链: 从下往上
学习前需理解对象,构造函数,数据类型
原型就是一个属性,这个属性是构造函数的属性,构造函数是用来出对象,是构造函数制造出来对象的公共祖先,后面所有对象都会继承原型的属性和方法
在js中万物皆为对象,原型也是一个对象
原型涉及:_ _proto _ _,prototype,constructor,this
_ _proto _ _ 这是用来查看原型的,这个是对象的属性(注意:万物皆对象),这个属性可以查看,但是不能修改(隐式属性)
prototype 设置原型,这个是构造函数的属性
constructor 这个是对象的属性,主要是看该对象的爹是谁(查看对象的构造函数)
最终的原型全都为Object.prototype
我们需要牢记两点:①__proto__和constructor属性是对象所独有的;② prototype属性是函数所独有的。但是由于JS中函数也是一种对象,所以函数也拥有__proto__和constructor属性
例子:
细讲_ _proto _ _ **
_ _proto _ _ 是指查找父级原型对象,当父级找不到时,会到父级的父级找,好比_ _proto _ 是一根线,从自己出发连接着自己父级的原型对象,原型对象也是对象,也拥有 _proto _ _属性,连接着父级原型对象的原型对象,最终的父级原型对象是Object原型对象,在往上就是null。他是一根线,所以只能通过它查看,并不能修改原型。
原型链
调用 __proto __ 可以看到父级的原型对象,父级原型对象里包含了 构造函数通过.prototype属性构造出来的原型,还有对象自带的__proto __ 和constructor ,
constructor 的原型,里面又包含了实例的属性和方法
父级的原型对象里的 _ _proto _ _则指向上一级的原型对象,里面包含了上一级的原型对象的__proto __,constructor,还有通过.prototype属性构造出来的原型。
当一个对象想要调用属性或方法时,会通过 __proto __这根线向上去查找,看自己的原型对象里有没有,没有则继续沿 __proto __这根线向上去查找,这个过程形成了一个链式链接,叫做原型链。
比如像原始数据类型number,string,undefined,null(比较特殊),boolean,还有引用数据类型Object,Array,Function都有自己的属性和方法,我们可以直接调用,是因为系统默认每种数据类型都有自己的构造函数,里面放着对应的属性和方法,供我们调用。
任何的一个对象都会继承自Object.prototype这个对象,几种数据类型的原型对象的父级原型对象就是Object.prototype这个对象。但是有一种特殊情况就是null,这个是对象占位符,真正意义上的没有原型的对象,因为null没有原型。Object.是祖先级别的话,那null则已经处于外星人级别了。
数据类型都有自己的原型对象
怎么去判断这些数据类型? 通过typeof
typeof可以返回几种值? 6种
number string boolean undefined object function
typeof null //object
typeof array //object
typeof object //object 他们的原型对象都是Object
怎么去区分这三个object?
Object.prototype.toString.call( 实例 )
例子
创建原型对象
以什么为原型创建对象
Object.create(obj)
var obj= {
lastName : "zhang"
}
var p1 = Object.create(obj);
p1.name = "三" ;
console.log(p1) //{name: "三"}
console.log(p1.lastName) //zhang
console.log(p1.__proto__) //{lastName: "zhang"}
//lastName: "zhang"
// __proto__: Object