Javascript中的原型继承机制
This picture can roughly describe the prototype inheritance relationship.
Here are some code explanations for each relationship~~
/*
关于对象与原型机制综合说明:
1.JS中采用原型继承方式,所以呢每一个对象都有一个原型对象,最原始的原型为null
2.在JS中__proto__和constructor属性是对象独有的,prototype属性是函数独有的
2.在JS中,以任何方式创建的对象都有原型对象,可以通过__proto__属性来访问原型对象
3.在JS中,构造函数也是对象,并且构造函数的prototype属性和继承相关,实例化出来的
对象的__proto__就是构造函数的prototype属性
*/
/*************************对各个关系的解释*****************************/
//关系1
function Foo(userName,age){
this.userName=userName;
this.age=age;
}
Foo.prototype.sayHi=function(){
console.log(this.userName+"say hi");
}
var f1=new Foo("lisi",20);
console.log(f1.__proto__===Foo.prototype); //true
/*
关系1:f1是通过构造函数Foo实例化出来的对象,所以f1对象的__proto__属性
与其构造函数Foo的prototype属性相同,指向相同,通过Foo实例化得到的对象
可以去Foo.prototype上查找方法,如sayHi方法
*/
//关系2
function Foo(userName,age){
this.userName=userName;
this.age=age;
}
console.log(typeof(Object.prototype)); //Object
console.log(Foo.prototype.__proto__===Object.prototype); //true
/*
关系2:构造函数的prototype属性是个真实的对象,所以Foo.prototype存在原型,用__proto__表示,
JS中Object可以视为一个函数,而Object.prototype就是一个对象,大部分的构造函数基本上
都具有一个继承自Object.prototype的原型,所以关系2成立
*/
//关系3
console.log(typeof(Object.prototype)); //Object
console.log(Object.prototype.__proto__); //null
/*
关系3: 原型链是指对象的原型链,因此原型链中全部为对象,Object.prototype在原型链中是个特殊的对象,它已不存在
原型对象,因此Object.prototype.__proto__为null,我觉得可以理解为Object.prototype对象的原型对象
是空,因此等于null,同时这也是原型链中的尽头
*/
//关系4和关系5
function Foo(userName,age){
this.userName=userName;
this.age=age;
}
console.log(typeof(Foo.prototype)); //Object
console.log(Foo.prototype.constructor===Foo); //true
/*
关系4: 正如在综述中所说,在JS中__proto__和constructor属性是对象独有的,prototype属性时函数独有的,
并且构造函数的prototype属性和继承相关,而Foo是一个构造函数,所以存在Foo.prototype,并且它是
一个对象
关系5: constructor属性指创建此实例的构造器,只有对象才有这个属性,它是从一个对象指向一个函数(就是此对象通
过什么函数创建的),所以Foo.prototype这个对象的constructor属性指向Foo函数
*/
//关系6
function Foo(userName,age){
this.userName=userName;
this.age=age;
}
console.log(Foo.__proto__===Function.prototype);
/*
关系6: 在JS中函数也是一种对象,所以函数也拥有__proto__属性。在JS中Function构造函数能创建一个
Function对象,实际上,每个函数都是一个Function对象
所以呢,对于关系6,Foo本身定义为一个函数,但是它也可以视为一个由Function定义的对象,
并且存在Foo.__proto__===Function.prototype
*/
//关系7
console.log(typeof(Function.prototype)); //function
console.log(Function.prototype.__proto__===Object.prototype);//true
/*
关系7: 在JS中每一个函数对象都有一个显示的prototype属性,它代表了对象的原型
但是Function.prototype函数对象是个例外,没有prototype属性。对其进行
typeof判断,返回function,说明它被定义为函数,可将其视为对象,添加
__proto__,此时Function.prototype.__proto__是一个对象,它与原型链最顶端
的Object.prototype相同
*/
//关系8
var student=new Object();
student.Name="zhangsan";
student.age=18;
student.hobby=function(){
console.log("football");
};
console.log(student); //会显示定义的student对象的详细信息
console.log(Object); //function
console.log(student.__proto__==Object.prototype);// true
/*
关系8: 通过Object方法创建出的对象,它的原型就是Object方法的prototype
*/
//关系9和关系10
var student=new Object();
console.log(typeof(Object.prototype)); //Object
/*
关系9:此处在创建student时,Object可视为一种用于创建对象的函数,对于函数Object()而言,存在prototype属性
即为Object.prototype
关系10:Object.prototype是一个对象,它的构造器为function Object(),也就是说这个对象是由函数function
Object()构造出来的,constructor属性只有对象才拥有,然后根据前面的分析,Object.prototype.constr
uctor就是function Object();
*/
//关系11
console.log(typeof(Object)); //function
console.log(Object.__proto__===Function.prototype);
/*
关系11: Object本身是一个函数,当然我们也可以把这个函数视为一个由Function定义的对象来看,
所以就存在Object.__proto__=Function.prototype
*/
//关系12和关系13
console.log(typeof(Function)); //function
console.log(typeof(Function.prototype)); //function
/*
关系12: 在JS中,每个函数都是一个Function对象,实际上,Function函数自身也是一个Function对象
Function()视为函数来看,自然就存在Function.prototype
关系13: Function.prototype在JS中是一个特殊的存在,它没有prototype属性,对其进行
typeof判断,返回function,因而存在constructor属性,虽然它是函数,但也能作为对象来
对象来看待,它由为function Function()函数构造出,所以Function.prototype.constructor=functi
on Function()
*/
//关系14
var Function=new Function();
/*
关系14: 在JS中Function本身也可以是一个Function对象,所以存在Function对象的__proto__等于Function方法
的prototype
*/