- 对象的_proto_属性
1.什么对象有proto
JS中一切皆对象,只要是对象,必有proto属性.(包括简单类型对象,var i=1;)
特例:(Object.prototype属性对象)和(Object对象.proto属性对象)没有proto属性.
2.proto属性哪里来
对象都有proto属性,对象是由类创建的,所以对象.proto属性是取自类的.
对象._proto_==类.prototype
3.proto属性也是一个对象
一切皆对象,proto属性也是一个对象,那么这个对象就也有proto,也来自其对应的类.prototype。这些层层包裹的proto们,就是原型链.
4.原型链
并不是所有proto对象都有proto属性,
最后一个proto对象==Object.prototype(所有对象的父类就是Object)
如:
(1).普通的引用对象,和简单类型对象的原型链
- var str=new String(‘armo’);
原型链为:String.protopyte→Object.protoptye
- var obj=new Object();
原型链为:Object.protoptye
(2).函数对象/类/构造器的原型链
- var obj=Object; //类也是一个对象
原型链为:Function.protoptye→Object.protoptye
- var obj=Function; //类也是一个对象
原型链为:Function.protoptye→Object.protoptye
- var obj=String; //类也是一个对象
原型链为:Function.protoptye→Object.protoptye
(3),prototype属性对象的原型链(只有函数对象有该属性)
var pro=String.prototype;
原型链为:Object.protoptye
var obj=Object.pro
原型链为:null
(4),proto属性对象的原型链(只有函数对象有该属性)
顶层proto对象没有proto属性,
如var obj=new Object(){};
obj.proto对象就没有proto属性没有原型链.
- prototype属性
只有(typeof XXX==function) 的对象才有prototype属性,即各种类
Object Function String Array Number ,包括自定义的类等
一个类所创建的对象中分为两个区域:
1.原生区域,
//name和age都是原生区域的属性
function User(name,age){
this.name=name;
this.age=age;
}
2.扩展区域
//job是扩展区域的属性
User.prototype.job="java";
3创建一个User对象的过程
var user=new User('armo',12);
//1.通过构造器生成原生区域
//2.赋值扩展区域user.__proto__=User.prototype;
所以,所有的对象有各自的原生区域,但是共用扩展区域.
- instanceof方法的实质
A instanceof B; (A是引用类型对象,B必须是拥有prototype属性的对象,即函数对象/类/构造器)
判断一个对象是否继承于一个类,实质就是判断
这个对象的proto属性(原型链),是否包揽了类的prototype属性.
//new String('armo')的原型链是 String.prototype→Object.prototype
new String('armo') instanceof Object;//true
new String('armo') instanceof String;//true
//Function 的原型链是Function.protoptye→Object.protoptye
//Object的原型链是Function.protoptye→Object.protoptye
//String的原型链是Function.protoptye→Object.protoptye
Function instanceof Object;//true
Object instanceof Function;//true
Function instanceof Function;//true
Object instanceof Object ;//true
String instanceof String;//false
- 继承方式
A为子类,B为父类,在JS中的继承方式是
A类之内:B.apply(this,arguments);
A类之外:A.prototype=new B();
function User(name,age){
this.name=name;
this.age=age;
}
function Baby(name,age,id){
User.apply(this,arguments);//类是super(形参)
this.id=id;
}
Baby.prototype=new User(); //将父类的原生区域和扩展区域都丢给子类的扩展区域
var baby=new Baby('armo',12,13);
此刻baby对象的原型链为
Baby.prototype->User.prototype->Object.protoptye
baby继承于Baby User Object