[js高手之路]原型对象(prototype)与原型链相关属…
2018-06-24 00:03:27来源:未知 阅读 ()
一,instanceof:
instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章
[js高手之路]构造函数的基本特性与优缺点
[js高手之路]一步步图解javascript的原型(prototype)对象,原型链
已经分享过了.
1 function CreateObj(uName) { 2 this.userName = uName; 3 this.showUserName = function () { 4 return '100'; 5 } 6 } 7 CreateObj.prototype.showUserName = function () { 8 return this.userName; 9 } 10 var obj1 = new CreateObj('ghostwu'); 11 var obj2 = new CreateObj('卫庄'); 12 13 console.log( obj1 instanceof CreateObj ); //true 14 console.log( obj2 instanceof CreateObj ); //true 15 console.log( obj1 instanceof Object ); //true 16 console.log( obj2 instanceof Object ); //true
二、isPrototypeOf:
如果隐式原型__proto__指向调用isPrototypeOf()方法的对象原型( CreateObj ), 那么这个方法就返回true,如:
1 var obj1 = new CreateObj('ghostwu'); 2 var obj2 = new CreateObj('卫庄'); 3 console.log( CreateObj.prototype.isPrototypeOf( obj1 ) ); //true 4 console.log( CreateObj.prototype.isPrototypeOf( obj2 ) ); //true
因为obj1,obj2的隐式原型__proto__指向的都是CreateObj.prototype, 有朋友可能会问CreateObj.prototype上面根本就没有isPrototypeOf这个方法,怎么可以
调用呢?
是的,没错,但是CreateObj.prototype的隐式原型__proto__指向了Object.prototype, 而isPrototypeOf存在Object.prototype上,所以就能够调用
三、Object.getPrototypeOf
获取实例的隐式原型(__proto__)的指向,因为obj1,obj2的__proto__都指向CreateObj.prototype
1 var obj1 = new CreateObj('ghostwu'); 2 var obj2 = new CreateObj('卫庄'); 3 console.log( Object.getPrototypeOf( obj1 ) === CreateObj.prototype ); //true 4 console.log( Object.getPrototypeOf( obj2 ) === CreateObj.prototype ); //true
四,实例访问属性和方法时,遵循就近查找原则
实例先在自己身上查找,有,就停止查找,如果没有,就沿着实例的__proto__继续往上查找,有,就停止查找,如果没有就继续沿着原型链一直往上查找,如果
所有的原型对象上都没有,那就是undefined.
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 22; 8 9 var obj1 = new CreateObj('ghostwu'); 10 obj1.age = 20; 11 var obj2 = new CreateObj('卫庄'); 12 13 console.log( obj1.age ); //20--->来自实例 14 console.log( obj2.age ); //22--->来自原型对象 15 16 delete obj1.age; 17 console.log( obj1.age ); //22--->来自原型
五,hasOwnProperty
判断属性是实例上的还是原型对象上的,如果是实例上的,返回true, 原型上的返回false
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 22; 8 var obj1 = new CreateObj('ghostwu'); 9 obj1.age = 20; 10 var obj2 = new CreateObj('卫庄'); 11 console.log( obj1.age ); //20--->来自实例 12 console.log( obj1.hasOwnProperty( 'age' ) ); //true 13 console.log( obj2.age ); //22--->来自原型对象 14 console.log( obj2.hasOwnProperty( 'age' ) ); //false 15 delete obj1.age; 16 console.log( obj1.age ); //22--->来自原型 17 console.log( obj1.hasOwnProperty( 'age' ) ); //false
六、in操作符
判断属性是否在实例或者原型对象上,只要一个满足条件,返回值都是true
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 22; 8 var obj1 = new CreateObj('ghostwu'); 9 obj1.age = 20; 10 console.log( 'age' in obj1 ); //true 11 var obj2 = new CreateObj('卫庄'); 12 console.log( 'age' in obj2 ); //true 13 delete obj1.age; 14 console.log( 'age' in obj1 ); //true 15 console.log( 'user' in obj1 ); //false 16 console.log( 'user' in obj2 ); //false
七,结合in和hasOwnProperty的用法,可以封装一个函数判断这个属性是否在原型对象上, 返回值为true:在原型对象上, false:不在原型对象上
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 20; 8 function hasPrototypeProperty( obj, name ){ 9 return !obj.hasOwnProperty( name ) && ( name in obj ); 10 } 11 var obj1 = new CreateObj('ghostwu'); 12 var obj2 = new CreateObj('卫庄'); 13 obj1.age = 10; 14 console.log( hasPrototypeProperty( obj1, 'age' ) ); //false 15 console.log( hasPrototypeProperty( obj2, 'age' ) ); //true
八、for...in 可以枚举实例和原型对象上的属性和方法,前提是:该属性和方法是可以枚举的
1 function CreateObj(uName) { 2 this.userName = uName; 3 } 4 CreateObj.prototype.showUserName = function () { 5 return this.userName; 6 } 7 CreateObj.prototype.age = 20; 8 var obj = new CreateObj( 'ghostwu' ); 9 10 for( var key in obj ){ 11 console.log( key ); //userName,age,showUserName 12 } 13 console.log( Object.prototype ); 14 for( var key in Object.prototype ){ 15 console.log( key );//枚举不了, Object.prototype上的属性和方法默认不可枚举,枚举属性为false 16 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 原型相关的知识点-new的实现原理 2019-08-14
- Vue学习之路由vue-router传参及嵌套小结(十) 2019-08-14
- Vue学习之路由vue-router小结(九) 2019-08-14
- js原型链 2019-08-14
- html.css.javascript 跟随着我一起走向前端之路 2019-05-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash