【JS】【对象的__proto__属性】【函数对象/类/构造器的prototype属性】
2017-12-25 12:31
495 查看
- 对象的_proto_属性
1.什么对象有protoJS中一切皆对象,只要是对象,必有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
相关文章推荐
- [JS]JS对象的内部原型(__proto__)和构造器的原型(prototype)
- Stripes视图框架Java对象属性验证和prototype.js Ajax的测试
- js通过prototype为对象注入属性
- JS对象进阶-理解prototype、proto、constructor
- js 高级开发:对象属性prototype,自定义命名空间,自定义继承,闭包封装
- 浅谈JS中对象、函数的__proto__属性和prototype对象
- javascript自学之路(四)————js对象类型之prototype属性的探索
- js之prototype用法(给对象添加通用属性/方法)
- js中函数对象的属性,函数原型属性length、name、prototype
- 从__proto__和prototype来深入理解JS对象和原型链
- js之prototype用法(给对象添加通用属性/方法)
- js-对象prototype属性剖析
- js prototype 添加属性对象
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
- js中一切皆为对象 JavaScript中__proto__与prototype的关系
- ES6-对象的扩展-_proto_ 属性,Object.setPrototypeOf(),Object.getProtitypeOf()
- 从__proto__和prototype来深入理解JS对象和原型链
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
- 关于JS call apply 对象、对象实例、prototype、Constructor、__proto__
- JS对象prototype 属性