Object
在JS 中,对象都是有原型的,甚至原型链。不过最终都是指向一个最初的原型,即 Object 对象的原型。那这个原型里都有啥呢?下面一起来看下,首先在浏览器控制台输入 {},我们知道这是创建一个对象。
从上面的图片我们发现对象的 原型属性 __proto__ 下面有 13 个属性或者函数(这里我用的是Chrome,不同浏览器可能不一样)。
原型函数
下面一一看下:
函数 | 作用 | 说明 |
obj.__defineGetter__(prop, func) | 将一个函数绑定在当前对象的指定属性上,当那个属性被读取时,你所绑定的函数就会被调用 | Web标准已废弃 |
obj.__defineSetter__(sprop, func) | 将一个函数绑定在当前对象的指定属性上,当那个属性被赋值时,你所绑定的函数就会被调用 | Web标准已废弃 |
obj.__lookupGetter__(sprop) | 返回当前对象上指定属性的属性读取访问器函数(getter),即上面设的函数 | Web标准已废弃 |
obj.__lookupSetter__(sprop) | 返回一个对象的某个属性上绑定了 setter (设置器)的钩子函数的引用 | Web标准已废弃 |
obj.toString() | 返回一个表示该对象的字符串 | |
obj.toLocaleString() | 返回调用 toString() 方法的结果 | |
obj.valueOf() | 返回值为该对象的原始值 | |
obj.constructor | 即 Object的构造函数 | |
obj.propertyIsEnumerable(prop) | 判断属性是否是当前对象可枚举的自身属性 | |
prototypeObj.isPrototypeOf(object) | 用于测试一个对象是否存在于另一个对象的原型链上 | |
obj.hasOwnProperty(prop) | 判断对象是否具有指定的属性作为自身(不继承)属性 |
例子
下面通过一些代码来说明各个函数的作用。
var obj = {};
var readCallback = function() {
console.log('name was read');
}
obj.__defineGetter__('name', readCallback);
console.log(obj.name);// 读取 name 属性后,会调用上面的函数。
var reassignCallback = function(val) {// 新值会作为参数传进来
console.log('name was assigned again with : ' + val);
};
obj.__defineSetter__('name', reassignCallback);
obj.name = 'name';// 修改 name 属性后,会调用上面的函数。
var lookupGetFun = obj.__lookupGetter__('name');// 返回上面我们设置的 Getter函数
console.log(lookupGetFun === readCallback)// 输出 true
var lookupSetFun = obj.__lookupSetter__('name');// 返回上面我们设置的 Setter函数
console.log(lookupSetFun === reassignCallback)// 输出 true
obj.__proto__.constructor === Object // 因为 obj 的原型式 Object ,因此输出 true
var hasNameProp = obj.hasOwnProperty('name') // 输出 true
obj.isPrototypeOf(Object);
var secondObj = {};
secondObj.__proto__.isPrototypeOf(obj)
// 因为 secondObj 和 obj 是共用一个原型,因此输出 true
var isNameEnumerable = obj.propertyIsEnumerable('name');
// 属性存在 且 可枚举时,才返回 true
defineProperty
上面一些函数的返回值其实与属性的三个特性有关:可写,可配置,可枚举。
可写,只有设为 true 时,该属性才能被赋值运算符赋值, 默认 true
可配置,只有设为true 时,描述符
才能够被改变,也能够被删除。默认 true
可枚举,只有设为true 时,属性才能够出现在对象的枚举属性中。默认 true
好了先看下语法:
// 参数 : 要设的对象,要设的属性,描述符(是个对象)描述符就是对上面说的三个特性的配置。看个例子
Object.defineProperty(obj, prop, descriptor)
Object.defineProperty(obj, 'secondName', {注意,这里 value、writable 和 get、set一定不能同时出现,否则报以下错误。
// value: "hust",
// writable: true,
// 数据描述符和存取描述符不能混合使用, value、writable 跟 get、set 不能同时使用。
configurable: true,
enumerable: true,
get: readCallback,
set: reassignCallback
});
Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
另外 Object 本身还有一些很实用的函数,有兴趣的可以自己阅读下Mozilla 官方文档。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object