资讯专栏INFORMATION COLUMN

[js高手之路]原型对象(prototype)与原型链相关属性与方法详解

svtter / 1589人阅读

摘要:一,检测左侧的原型链上,是否存在右侧的原型我在之前的两篇文章高手之路构造函数的基本特性与优缺点高手之路一步步图解的原型对象原型链已经分享过了卫庄二如果隐式原型指向调用方法的对象原型那么这个方法就返回,如卫庄因为的隐式原型指向的都是,有朋友可

一,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         }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85050.html

相关文章

  • [js高手之路]构造函数的基本特性优缺点

    摘要:所以一句话理解的运算规则为检测左侧的原型链上,是否存在右侧的原型。 上文,通过基本的对象创建问题了解了构造函数,本文,我们接着上文继续了解构造函数的基本特性,以及优缺点. 每个对象上面都有一个constructor属性( 严格意义上来说,是原型上的,对象是通过查找到原型找到 constructor属性 ).后面讲到原型的时候,我会用示意图的方式说明 1 functio...

    Ajian 评论0 收藏0
  • javaScript原型原型详解(二)

    摘要:当然这还没完,因为我们还有重要的一步没完成,没错就是上面的第行代码,如果没有这行代码实例中的指针是指向构造函数的,这样显然是不对的,因为正常情况下应该指向它的构造函数,因此我们需要手动更改使重新指向对象。 第一节内容:javaScript原型及原型链详解(二) 第一节中我们介绍了javascript中的原型和原型链,这一节我们来讲利用原型和原型链我们可以做些什么。 普通对象的继承 ...

    widuu 评论0 收藏0
  • [js高手之路] es6系列教程 - 新的类语法实战选项卡

    摘要:其实的面向对象很多原理和机制还是的,只不过把语法改成类似和老牌后端语言中的面向对象语法一用封装一个基本的类是不是很向和中的类其实本质还是原型链,我们往下看就知道了首先说下语法规则中的就是类名,可以自定义就是构造函数,这个是关键字,当实例化对 其实es6的面向对象很多原理和机制还是ES5的,只不过把语法改成类似php和java老牌后端语言中的面向对象语法. 一、用es6封装一个基本的类 ...

    yintaolaowanzi 评论0 收藏0
  • [js高手之路]使用原型对象(prototype)需要注意的地方

    摘要:原型对象的共享特性,可以很方便的为一些内置的对象扩展一些方法,比如,数组去重复但是,不要随便往内置的对象上面扩展方法,在多人协作开发,很容易产生覆盖,以及污染 我们先来一个简单的构造函数+原型对象的小程序 1 function CreateObj( uName, uAge ) { 2 this.userName = uName; 3 ...

    chnmagnus 评论0 收藏0
  • JavaScript学习总结(五)原型原型详解

    摘要:原型对象内部也有一个指针属性指向构造函数实例可以访问原型对象上定义的属性和方法。在创建子类型的实例时,不能向超类型的构造函数中传递参数。 赞助我以写出更好的文章,give me a cup of coffee? 2017最新最全前端面试题 私有变量和函数 在函数内部定义的变量和函数,如果不对外提供接口,外部是无法访问到的,也就是该函数的私有的变量和函数。 function ...

    EscapedDog 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<