【JS】【对象的__proto__属性】【函数对象/类/构造器的prototype属性】

- 对象的_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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值