JavaScript之面向对象学习二(原型属性对象与in操作符)获取对象中所有属性的方法
1、原型属性对象于in操作符之in单独使用
有两种方式使用in操作符:单独使用和在for-in循环中使用。在单独使用中,代码如下:
function Person(){
}
Person.prototype.name="张三";
Person.prototype.age=22;
Person.prototype.job="coder";
Person.prototype.sayName=function(){
alert(this.name);
}
var person1=new Person();
var person2=new Person();
alert(person1.hasOwnProperty("name")); //输出:false,因为person1并没有自己的实例属性!
alert("name" in person1); //输出:true,因为person1含有[[Prototype]]属性,该属性是一个指针,指向Person构造函数的原型属性对象。
// person1所指向的原型属性对象里面含有name属性,所以person1实例能够访问"name"属性。
person1.name="李四";
alert(person1.name); //输出"李四", 因为person1.name="李四";给person1实例定义了一个name属性,该属性将原型属性对象中的name属性屏蔽了
//屏蔽的原因是当执行person1.name代码时,JS会先到person1实例中寻找name属性,如果实例中没有该属性,则会去原型属性对象中寻找name属性
//所以这里在person1实例中找到了name属性,则JS就不会再去原型属性对象那个中寻找该属性,原型对象中的同名属性就会被忽略
alert(person1.hasOwnProperty("name"));//输出:true 因为person1.name="李四"给person1实例定义了一个实例属性
alert("name" in person1);//输出:true person1实例对象里面含有name属性,所以"name"属性可以访问
alert(person2.name);
alert(person2.hasOwnProperty("name")); //输出:false person2实例没有自己的实例属性
alert("name" in person2); //输出:true person2所指向的原型属性对象里面含有name属性,所以person1实例能够访问"name"属性。
delete person1.name;
alert(person1.hasOwnProperty("name")); //输出:false 因为delete person1.name;person1的实例被删除,所以此时person1没有实例属性
alert("name" in person1); ////输出:true person1所指向的原型属性对象里面含有name属性,所以person1实例能够访问"name"属性。
观察上面的代码我们发现,当in操作符单独使用的时候有一个规律如下:
属性 in 对象的实例
他的用法就是:判断这个属性能否被对象的实例所访问到,如果对象实例能访问到属性返回true,如果不能返回false;
注意:这里的属性可以是对象实例的属性,也可以是对象实例的[[Prototype]]属性指针,所指向的原型对象;
下面是结合Object.hasOwnProperty()和in判断一个属性到底是实例属性,还是实例对应原型对象的额属性,代码如下:
function Person(){
}
Person.prototype.name="张三";
Person.prototype.age=22;
Person.prototype.job="coder";
Person.prototype.sayName=function(){
alert(this.name);
}
var person1=new Person();
var person2=new Person();
/*
@param object ---对象的实例名
@param name ---需要判断的对象属性
功能:判断name是实例的原型属性对象的属性还是实例的实例属性
*/
function hasPrototypePrototype(object,name){
return !object.hasOwnProperty(name) && (name in object);
}
alert(hasPrototypePrototype(person1,"name")); //输出:true 说明person1能访问"name"属性,person1的实例属性中没有"name"属性,说明"name"属性是原型对象中属性
person1.name="李四";
alert(hasPrototypePrototype(person1,"name")); //输出:false 有两种情况 1、"name"属性既不是实例属性,也不是原型对象属性 2、person1能访问"name"属性,person1有"name"属性
2、原型属性对象与与in操作符之for-in结合使用
在使用for-in循环时,返回的是所有能够通过对象访问的、可枚举的属性,既包括实例中的属性又包括原型对象中的属性;
注意:屏蔽了原型中不可枚举属性(即将[[Enumerable]]设置为false的属性)也会在for-in循环中返回,因为根据规定,所有开发人员定义的属性都是可枚举的---只有IE8即更早版本中例外
代码如下:
var o={
toString:function(){
return "My Object";
}
}
for(var property in o){
if(property=="toString"){
alert("Found toString"); //在IE8 中不显示
}
}
输出:Found toString,
注意:在IE中存在一个bug,因为其实现认为原型的toString()方法被打上了值为false的[[Enumerable]]标记(所以该属性无法被循环),因此应该跳过该属性,所以我们就看不到警告框,所以该bug会影响默认不可枚举的所有属性和方法,包括:hasOwnProperty()、propertyIsEnumerable()、toLocaleString、toString、valueOf()。
ECMAScript 5也将constructor和prototype属性的[[Enumerable]]特性设置为false,但并不是所有的浏览器都照此实现。
3、使用Object.keys()方法获取指定对象中所有可枚举的实例属性
ECMAScript 5中提供了Object.keys()方法。这个方法接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组,代码如下:
function Person(){
}
Person.prototype.name="张三";
Person.prototype.age=22;
Person.prototype.job="coder";
Person.prototype.sayName=function(){
alert(this.name);
}
var keys=Object.keys(Person.prototype); //Person.prototype =》获取Person构造函数的原型属性对象 ;
//Object.keys(Person.prototype)=》获取原型属性对象的所有属性名,是键不是值
alert(keys); //输出name、age、job、sayName
var person=new Person();
person.name="李四";
person.age=22;
var personkeys=Object.keys(person); //获取person实例的属性不包含其原型对象的属性。
alert(personkeys); //输出:name、age
var allkeys=Object.getOwnPropertyNames(Person.prototype); //获取Person构造函数原型对象的所有属性(包括不可枚举的属性([[Enumerable]]设为false的属性))
alert(allkeys);//输出:constructor,name,age,job,sayName 注意:在ECMAScript 5中constructor属性是不可枚举的
JavaScript之面向对象学习二(原型属性对象与in操作符)获取对象中所有属性的方法的更多相关文章
- JavaScript之面向对象学习一
1.通过Object构造函数和对象字面量来创建对象缺点:使用同一个接口创建很多的对象,会产生大量的重复代码.比如我需要创建人的对象,并且需要三类人,医生.工程师.老师,他们可以抽象出很多属性,比如姓名 ...
- 【NX二次开发】UF_OBJ_ask_display_properties获取对象所在层、获取对象颜色、获取对象是否隐藏、获取对象是否高亮,获取对象线宽、字体大小
UF_OBJ_ask_display_properties 返回一个对象的显示属性(层.颜色.隐藏状态.线宽和字体). UF_OBJ_disp_props_p_t结构体: layer int 对象所在 ...
- JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)
一.动态原型模式 在面向对象学习六中的随笔中,了解到组合构造函数模式和原型模式创建的自定义类型可能最完善的!但是人无完人,代码亦是如此! 有其他oo语言经验的开发人员在看到独立的构造函数和原型时,很可 ...
- JavaScript之面向对象学习六原型模式创建对象的问题,组合使用构造函数模式和原型模式创建对象
一.仔细分析前面的原型模式创建对象的方法,发现原型模式创建对象,也存在一些问题,如下: 1.它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认的情况下都将取得相同的属性值,这还不是最大的问题 ...
- JavaScript之面向对象学习四原型对象的动态性
1.由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能够立即从实例上反映出来---即便是先创建了实例后修改原型也是如此.代码如下: function Person(){ } va ...
- JavaScript的面向对象原理之原型链详解
一.引言 在16年的10月份,在校内双选会找前端实习的时候,hr问了一个问题:JavaScript的面向对象理解吗?我张口就说“JavaScript是基于原型的!”.然后就没什么好说的了,hr可能不知 ...
- JavaScript的面向对象原理之原型链
二.JavaScript的对象 为了能够清楚的解释这一切,我先从对象讲起.从其他面向对象语言(如Java)而来的人可能认为在JS里的对象也是由类来实例化出来的,并且是由属性和方法组成的. 实际上在JS ...
- android NDK 实用学习(二)-java端对象成员赋值和获取对象成员值
1,关于java端类及接口定义请参考: android NDK 实用学习-获取java端类及其类变量 2,对传过来的参数进行赋值: 对bool类型成员进行赋值 env->SetBooleanF ...
- JavaScript之面向对象学习三原型语法升级
1.到目前为止,我们是时候分析下前面的使用原型语法来定义对象有哪些不足的地方,代码如下: function Person(){ } Person.prototype.name="张三&quo ...
随机推荐
- 【翻译】Microsoft Ajax Minifier 快速使用指南(与VS集成使用) 编译后直接压缩项目的JS或CSS文件
网上找了好久终于找到一个能跟VS集成使用的JS和CSS压缩工具,因为害怕忘记,所以给转发过来,顺便翻译一下,大学那会儿学的英语基本上都已经还给老师了,所以翻译的不太好,不过能看懂就成,对吧? 原文地址 ...
- Android 给Button加个监听
1.日期设置控件:DatePickerDialog 2.时间设置控件:TimePickerDialog 实例代码 1.页面添加两个Button,单击分别显示日期设置控件和时间设置控件,还是有TextV ...
- 【Spring MVC系列】--(4)返回JSON
[Spring MVC系列]--(4)返回JSON 摘要:本文主要介绍如何在控制器中将数据生成JSON格式并返回 1.导入包 (1)spring mvc 3.0不需要任何其他配置,添加一个jackso ...
- jQuery插件
1. Lightbox 2: Lightbox 2 是一款很酷的图片显示插件,可以在一个平滑展开的新窗口中展现出图片,而同时页面的其余部分都变成黑色背景.使用这款插件,是为了当你的的图片过大必须 ...
- iOS 性能测试 - FBMemoryProfiler
FBMemoryProfiler 是Facebook开源的一款用于分析iOS内存使用和检测循环引用的工具库. 脑补:http://www.cocoachina.com/ios/20160421/159 ...
- 矩形嵌套(LIS)
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...
- 关于oracle的certview
前两天去参加oracle 11g 的两门考试(1Z0-051和1Z0-052),在家看了好几遍题库,我本来想着上午一门,下午考一门,但是我嫌着麻烦,就预约一下午考完两门.在考试完一门后,发现成绩不 ...
- Qt on Android:QTableView不显示选中虚框
在使用 QTableView 或 QTableWidget 时.有时我们不想要选中虚框,能够实现一个 ItemDelegate ,重写 drawFocus() 和 drawCheck() 两个虚函数 ...
- SpringMVC中的异步提交表单
1.前言 近期在做一个项目,前台框架用的是EasyUI+SpringMVC,因为对SpringMVC不太了解,所以刚開始接触的时候有点吃力,在此通过一个EasyUi中的DataGrid表格来总结一下. ...
- 【Sharepoint】CSS与Master Page的开发与部署
一.CSS的开发与部署相对比较简单,先是要上传CSS文件到样式库中,然后在页面模板中将上传的自定义CSS样式文件设置为所有文件的默认css文件.下面详细的介绍CSS文件的开发与部署过程. 1.编写自定 ...