您的位置:首页 > Web前端 > JavaScript

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

2017-12-25 12:31 495 查看

- 对象的_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  prototype javascript