博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原型1
阅读量:5319 次
发布时间:2019-06-14

本文共 2711 字,大约阅读时间需要 9 分钟。

1、hasOwnProperty():判断属性是不是自身属性,是返回true=>对象.hasOwnProperty(属性)

     in:自身和原型都返回true =>属性 in 对象

function Animate(name){  this.name = name;   //自身属性} Animate.prototype.age = 20; //原型属性var c = new Animate('aaa');console.log(c.hasOwnProperty('name'));   //trueconsole.log(c.hasOwnProperty('age'));  //falseconsole.log('name' in c ) // trueconsole.log('age' in c ) //truefor (var attr in c){  if (c.hasOwnProperty(attr)){    console.log(attr);           //只会打印name  }  }

因此通过以上属性,就可以判断是存在对象中?还是原型中?

function hasPrototypeProperty(object,name){            return !object.hasOwnProperty(name) && (name in object);    // 原型返回true,自身属性返回false        }

一些对比,如下:

 

2、propertyIsEnumerable():用来判断是否可枚举,返回boolean

  *自身属性可枚举
  *原型属性、内建属性和方法不可枚举

console.log( c.propertyIsEnumerable('name') );  //name由于是自身属性,因为可枚举,trueconsole.log( c.propertyIsEnumerable('age') ); //age 是在原型上,是不可枚举的,falseconsole.log( c.constructor.prototype.propertyIsEnumerable('age') ) ; //  c.constructor指向的是构造函数Animate,当Animate.prototype.prototypeIsEnumerable这时原型就是可枚举的,true

3、确定原型和实例的关系:instanceof 或 isPrototypeOf ,可以判断引用类型

  new出来的对象 instanceof 构造函数

  构造函数.prototype.isPrototypeof( new出来的对象)

console.log(c instanceof Animate)   // trueconsole.log(c instanceof Object )  //trueconsole.log( Object.prototype.isPrototypeof(c) ) //trueconsole.log( Animate.prototype.isPrototypeof(c) ) //true

   toString用来做引用类型的判断

var arr = [];  console.log(Object.prototype.toString.call(arr));//[object Array]  console.log(Object.prototype.toString.call(arr) == '[object Array]'); // true   /*    []           : '[object Array]'    {}           : '[object object'    new Date     :'[object Date]'     null         :'[object Null]'     new RegExp   : [object RegExp]    */

使用toString是相对完美的解决方法,用instanceof或者constructor,在iframe中无法判断引用类型,例子如下:

window.onload = function(){      var oF = document.createElement('iframe');      document.body.appendChild(oF);      var ifArray = window.frames[0].Array;  //iframe下的array      var arr = new ifArray();  //iframe下创建一个数组      console.log(arr.constructor == Array); //false      console.log(arr instanceof Array); //false      console.log(Object.prototype.toString.call(arr) == '[object Array]')  //true    }

 

4、Object.getPrototypeOf:找到原型,返回Object

var lang = {  'cn':'简体',  'tw':'繁体'};function He(){}He.prototype = lang;var k = new He();console.log(lang.isPrototypeOf(k));   // trueconsole.log(Object.getPrototypeOf(k));  //k上的原型是lang对象

 

其他:

1、原型链__proto__这个,最终都会找到最上层的Object对象

2、当He.prototype={},这时会更改到constructor,需要重新指定一下,即:He.prototype = {constructor:He}
3、可以扩展内建对象(Array,String等),如String.prototype.reverse= funciton(){},为防止将来被扩展,需要做一下检测工作,即:if (typeof String.prototype.reverse != 'function')

 

转载于:https://www.cnblogs.com/joya0411/p/5345348.html

你可能感兴趣的文章
大数据学习
查看>>
简单工厂模式
查看>>
Delphi7编译的程序自动中Win32.Induc.a病毒的解决办法
查看>>
Objective-C 【关于导入类(@class 和 #import的区别)】
查看>>
倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-点击运行按钮进入到运行状态报错Error starting TwinCAT System怎么办 AdsWarning1823怎么办...
查看>>
【转】javascript 中的很多有用的东西
查看>>
Centos7.2正常启动关闭CDH5.16.1
查看>>
Android 监听返回键、HOME键
查看>>
Android ContentProvider的实现
查看>>
sqlserver 各种判断是否存在(表名、函数、存储过程等)
查看>>
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
(五)归一化
查看>>
使用信号量
查看>>
实验八 接口与实现接口的类
查看>>
PostgreSQL 保留关键字添加方法之一,不带参数的函数
查看>>
赛前热手 (天梯赛暴力题)
查看>>
【转贴】SAP HANA内存数据库详解
查看>>