目录
什么是原型
每一个javascript对象(除null外)创建的时候,都会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型中“继承”属性,所有函数都有原型对象。
JS数据类型
基本数据类型(值类型)
string、number、boolearn、null、undefined
复杂数据类型(引用类型)
Array、Object、Function
构造函数
如下图 p 和 p1 都是 Person(构造函数) 的实例。这两个实例都有一个 constructor (构造函数)属性,该属性指向 Person,即:p.constructor == Person 、p1.constructor == Person。
function Person(uname,age,sex){ //构造函数
this.uname = uname;
this.age = age;
this.sex = sex;
}
let p = new Person("竺甜菜",18,"男"); //通过 new 实例化对象
let p1 = new Person("html",20,"nv ");
console.log(p,p1);
原型对象
原型对象,就是构造函数的prototype属性,即Person.
prototype。
function Person(uname,age,sex){
this.uname = uname;
this.age = age;
this.sex = sex;
}
Person.prototype.fn = function(){
console.log("这是原型对象上的方法");
}
prototype
在JavaScript中,所有函数都有一个prototype属性,这个属性指向函数的原型对象。
构造函数访问原型对象: prototype --- 存放公共方法
实例对象访问原型对象: __proto__ --- 存放公共方法
proto
这是每个对象(除null外)都会有的属性,叫做__proto__,这个属性会指向该对象的原型。
prototype 与 proto 具体应用关系如下图 :
function Person(uname,age,sex){
this.uname = uname;
this.age = age;
this.sex = sex;
this.fn = function(){
console.log(this.uname+"今年"+this.age+"岁了------"+this.sex);
}
}
Person.prototype.fn = function(){
console.log("这是原型对象上的方法");
}
console.log("原型对象---- prototype",Person.prototype);
let p = new Person("竺甜菜",18,"男"); //实例化对象
let p1 = new Person("html",20,"nv"); //实例化对象
console.log(p,p1);
// p.fn();
// p1.fn();
//console.log(p.fn === p1.fn);
// console.log(Person.prototype === p.__proto__ );
// console.log(p1.fn === p.fn);
// console.log(Person.prototype.constructor === Person);
constructor
每个原型都有一个constructor属性,指向该关联的构造函数 。
console.log(Person.prototype.constructor == Person);
实例与原型
我们在读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直到找到最顶层为止。这样就形成了原型链 。
原型的原型
我们说原型是对象创建的时候关联的另一个对象,那么原型也是一个对象,既然是对象那么原型也应该关联一个对象是原型的原型。
let obj = new Object();
原型链
综上所述 ,将原型的实例赋值给另一个对象,另一个对象再赋值给其他的对象,在实际的代码中对对象不同的赋值,就会形成一条原型链。关系图如下: