Javascript学习笔记(Object 对象与继承)
2017-12-15 10:01
831 查看
Object 对象与继承
来自《JavaScript 标准参考教程(alpha)》,by 阮一峰
目录
Object.getOwnPropertyNames()Object.prototype.hasOwnProperty()
in 运算符和 for…in 循环
对象的拷贝
参考链接
通过原型链,对象的属性分成两种:自身的属性和继承的属性。JavaScript 语言在
Object对象上面,提供了很多相关方法,来处理这两种不同的属性。
Object.getOwnPropertyNames()
Object.getOwnPropertyNames方法返回一个数组,成员是对象本身的所有属性的键名,不包含继承的属性键名。
Object.getOwnPropertyNames(Date) // ["parse", "arguments", "UTC", "caller", "name", "prototype", "now", "length"]
上面代码中,
Object.getOwnPropertyNames方法返回
Date所有自身的属性名。
对象本身的属性之中,有的是可以枚举的(enumerable),有的是不可以枚举的,
Object.getOwnPropertyNames方法返回所有键名。只获取那些可以枚举的属性,使用
Object.keys方法。
Object.keys(Date) // []
Object.prototype.hasOwnProperty()
对象实例的hasOwnProperty方法返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。
Date.hasOwnProperty('length') // true Date.hasOwnProperty('toString') // false
hasOwnProperty方法是JavaScript之中唯一一个处理对象属性时,不会遍历原型链的方法。
in 运算符和 for…in 循环
in运算符返回一个布尔值,表示一个对象是否具有某个属性。它不区分该属性是对象自身的属性,还是继承的属性。
'length' in Date // true 'toString' in Date // true
in运算符常用于检查一个属性是否存在。
获得对象的所有可枚举属性(不管是自身的还是继承的),可以使用
for...in循环。
var o1 = {p1: 123}; var o2 = Object.create(o1, { p2: { value: "abc", enumerable: true } }); for (p in o2) {console.info(p);} // p2 // p1
为了在
for...in循环中获得对象自身的属性,可以采用
hasOwnProperty方法判断一下。
for ( var name in object ) { if ( object.hasOwnProperty(name) ) { /* loop code */ } }
获得对象的所有属性(不管是自身的还是继承的,以及是否可枚举),可以使用下面的函数。
function inheritedPropertyNames(obj) { var props = {}; while(obj) { Object.getOwnPropertyNames(obj).forEach(function(p) { props[p] = true; }); obj = Object.getPrototypeOf(obj); } return Object.getOwnPropertyNames(props); }
上面代码依次获取
obj对象的每一级原型对象“自身”的属性,从而获取
Obj对象的“所有”属性,不管是否可遍历。
下面是一个例子,列出
Date对象的所有属性。
inheritedPropertyNames(Date) // [ // "caller", // "constructor", // "toString", // "UTC", // "call", // "parse", // "prototype", // "__defineSetter__", // "__lookupSetter__", // "length", // "arguments", // "bind", // "__lookupGetter__", // "isPrototypeOf", // "toLocaleString", // "propertyIsEnumerable", // "valueOf", // "apply", // "__defineGetter__", // "name", // "now", // "hasOwnProperty" // ]
对象的拷贝
如果要拷贝一个对象,需要做到下面两件事情。确保拷贝后的对象,与原对象具有同样的prototype原型对象。
确保拷贝后的对象,与原对象具有同样的属性。
下面就是根据上面两点,编写的对象拷贝的函数。
function copyObject(orig) { var copy = Object.create(Object.getPrototypeOf(orig)); copyOwnPropertiesFrom(copy, orig); return copy; } function copyOwnPropertiesFrom(target, source) { Object .getOwnPropertyNames(source) .forEach(function(propKey) { var desc = Object.getOwnPropertyDescriptor(source, propKey); Object.defineProperty(target, propKey, desc); }); return target; }
相关文章推荐
- JavaScript学习笔记2-五种原始数据类型和Object对象类型
- JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承
- javascript继承学习系列之三:对象伪装(Object Masquerading)
- 【Javascript学习笔记】由JavaScript中call()方法引发的对面向对象继承机制call的思考
- JavaScript 学习笔记 - 对象和继承
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- javascript学习笔记(十) js对象 继承
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
- JavaScript学习笔记之对象及继承
- Object-C 学习笔记(八)---面相对象(继承)
- JavaScript 对象 之继承对象 学习笔记
- Javascript学习笔记--Object对象
- javascript之对象学习笔记(二)--对象原型,继承
- js学习笔记——理解javascript的对象与继承
- javascript学习笔记(一)--对象
- java学习笔记5:对象继承upcasting
- asp.net ajax 学习笔记--对javascript对象的扩展
- javascript学习笔记(六):对象、内置对象
- JSON-JavaScript对象表示法--学习笔记