一、原型指向
结构:原型是一个对象,在原型中通常拥有两个属性:
(1)构造器constructor:该属性指向了这个类本身
(2)原型指向:——proto——:该属性指向原型本身,提供给通过类创建的对象使用
console.log(lb.__proto__ == Person.prototype);
eg:
function Person(userName, sex) {
this.userName = userName;
this.sex = sex;
}
console.log(Person.prototype);//Object { … }
var lb = new Person('李白', '男');
console.log('--->', lb.__proto__);//Object { … }
console.log(lb.__proto__ == Person.prototype);//true
二、原型链
1、定义:由【对象的__proto__属性】和【对象的构造函数的原型的__proto__属性】构成的链式结构称为原型链。
2、注意:
①原型的终点是object的原型,object的原型的原型是null;
②对象查找属性值时,首先在对象内部查找;没有时去原型中查找;再没有时延原型链向上查找;没有值报错或者undefined。
实质就是获取原型链上的值。
③定义到object原型上的属性、对象都可以访问(函数也可以)。
3、eg:
function Person(userName, sex) {
this.userName = userName;
this.sex = sex;
}
var df = new Person('杜甫','男');
(1)对象构造函数的原型
console.log(df.__proto__);//Object { … }
(2)对象构造函数原型的原型 --->Object的原型
console.log(df.__proto__.__proto__);//Object { show: "呵呵", … }
(3)object已经到达顶层,没有比她更高的类
console.log(df.__proto__.__proto__.__proto__);//null
console.log(df.__proto__.__proto__==Object.prototype);//true
eg2:
function test(){};
var func1 = new Function('a','b','console.log(a+b)');//30
func1(10,20);
console.log('func1--->',func1.__proto__ == Function.prototype);//func1---> true
console.log(func1.__proto__.__proto__);//Object { show: "呵呵", … }
console.log(test.show);//呵呵
三、继承
1、定义:设置【子类的原型】是【父类的实例(具象化的对象)】的操作,被认为是js中的继承。
2、访问对象的属性或方法:
①首先在本身中查找是否拥有这个属性或方法;
②如果没有就沿着原型链逐级查找直到找到object为止;
③在任何一级寻找到这个属性或者方法都视为对象拥有这个属性或方法。
function MaYun() {
this.money = '没有钱'
}
MaYun.prototype.money = '很多钱';
var maYun = new MaYun();
function Son(userName) {
this.userName = userName;
}
Son.prototype = maYun;
var son = new Son('小刚');
console.log(son.money);//没有钱