We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Object常见静态方法总览: (1)对象属性模型的相关方法
(2)控制对象状态的方法
(3)原型链相关方法
由上图可见,proto 为null、Object、Object.prototype时,使用Object.create创建新对象的结构都是不一样的。不同点在于"是否继承与Object"、"还是继承于Object.prototype"。
为什么vue中普遍使用 Object.create(null) 初始化新对象,而不是{}呢?
对于一般的对象来说,Object.keys()和Object.getOwnPropertyNames()返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys方法只返回可枚举的属性,Object.getOwnPropertyNames方法还返回不可枚举的属性名。
var a = ['Hello', 'World']; Object.keys(a) // ["0", "1"] Object.getOwnPropertyNames(a) // ["0", "1", "length"]
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
下面是属性描述对象的一个例子。
{ value: 123, // 默认为undefined writable: false, // 默认为true enumerable: true, configurable: false, get: undefined, set: undefined }
获取属性描述对象。它的第一个参数是一个对象,第二个参数是一个字符串,对应该对象的某个属性名。
而 Object.getOwnPropertyDescriptors(obj) 功能一样,只不过获取obj所有属性的描述。
注意,Object.getOwnPropertyDescriptor方法只能用于对象自身的属性,不能用于继承的属性。
前者返回参数对象自身的全部属性的属性名,不管该属性是否可遍历;后者只返回可遍历的属性。
Object.defineProperty(object, propertyName, attributesObject)
var obj = Object.defineProperty({}, 'p', { value: 123, writable: false, enumerable: true, configurable: false }); obj.p // 123 obj.p = 246; obj.p // 123
var obj = Object.defineProperties({}, { p1: { value: 123, enumerable: true }, p2: { value: 'abc', enumerable: true }, p3: { get: function () { return this.p1 + this.p2 }, enumerable:true, configurable:true } }); obj.p1 // 123 obj.p2 // "abc" obj.p3 // "123abc"
注意,一旦定义了取值函数get(或存值函数set),就不能将writable属性设为true,或者同时定义value属性,否则会报错。
如果一个属性的enumerable为false,下面三个操作不会取到该属性。
因此,enumerable可以用来设置“秘密”属性。
var obj = {}; Object.defineProperty(obj, 'x', { value: 123, enumerable: false }); obj.x // 123 for (var key in obj) { console.log(key); } // undefined Object.keys(obj) // [] JSON.stringify(obj) // "{}"
configurable(可配置性)返回一个布尔值,决定了是否可以修改属性描述对象。也就是说,configurable为false时,value、writable、enumerable和configurable都不能被修改了。也决定了目标属性是否可以被删除(delete)。
除了直接定义以外,属性还可以用存取器(accessor)定义。其中,存值函数称为setter,使用属性描述对象的set属性;取值函数称为getter,使用属性描述对象的get属性。
var obj = Object.defineProperty({}, 'p', { get: function () { return 'getter'; }, set: function (value) { console.log('setter: ' + value); } }); obj.p // "getter" obj.p = 123 // "setter: 123"
JavaScript 还提供了存取器的另一种写法:
var obj = { get p() { return 'getter'; }, set p(value) { console.log('setter: ' + value); } };
存取器往往用于,属性的值依赖对象内部数据的场合。
var extend = function (to, from) { for (var property in from) { if (!from.hasOwnProperty(property)) continue; Object.defineProperty( to, property, Object.getOwnPropertyDescriptor(from, property) ); } return to; } extend({}, { get a(){ return 1 } }) // { get a(){ return 1 } })
有时需要冻结对象的读写状态,防止对象被改变。JavaScript 提供了三种冻结方法,最弱的一种是Object.preventExtensions,其次是Object.seal,最强的是Object.freeze。
Object.seal实质是把属性描述对象的configurable属性设为false,因此属性描述对象不再能改变了。 Object.seal只是禁止新增或删除属性,并不影响修改某个属性的值。
if (!Object.isFrozen(obj)) { obj.p = 'world'; }
作用是返回一个对象的字符串形式,默认情况下返回类型字符串。常用语判断数据类型。
Object.prototype.toString.call(value)
例如:
封装方法:
var type = function (o){ var s = Object.prototype.toString.call(o); return s.match(/\[object (.*?)\]/)[1].toLowerCase(); }; ['Null', 'Undefined', 'Object', 'Array', 'String', 'Number', 'Boolean', 'Function', 'RegExp' ].forEach(function (t) { type['is' + t] = function (o) { return type(o) === t.toLowerCase(); }; }); type.isObject({}) // true type.isNumber(NaN) // true type.isRegExp(/abc/) // true
reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。
a默认是数组的第一个元素,此时b为数组第二个元素。也可以像下面这样指定初始的a,则b初始是数组第一个元素:
第三个参数,用于增加返回的 JSON 字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。
属性描述对象
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Object
Object常见静态方法总览:
(1)对象属性模型的相关方法
(2)控制对象状态的方法
(3)原型链相关方法
Object.create(proto,[propertiesObject])
由上图可见,proto 为null、Object、Object.prototype时,使用Object.create创建新对象的结构都是不一样的。不同点在于"是否继承与Object"、"还是继承于Object.prototype"。
为什么vue中普遍使用 Object.create(null) 初始化新对象,而不是{}呢?
Object.keys(),Object.getOwnPropertyNames()
对于一般的对象来说,Object.keys()和Object.getOwnPropertyNames()返回的结果是一样的。只有涉及不可枚举属性时,才会有不一样的结果。Object.keys方法只返回可枚举的属性,Object.getOwnPropertyNames方法还返回不可枚举的属性名。
属性描述对象
JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。
下面是属性描述对象的一个例子。
Object.getOwnPropertyDescriptor(obj, propertyName)
获取属性描述对象。它的第一个参数是一个对象,第二个参数是一个字符串,对应该对象的某个属性名。
而 Object.getOwnPropertyDescriptors(obj) 功能一样,只不过获取obj所有属性的描述。
Object.getOwnPropertyNames() 和 Object.keys()
前者返回参数对象自身的全部属性的属性名,不管该属性是否可遍历;后者只返回可遍历的属性。
Object.defineProperty(),Object.defineProperties()
enumerable
如果一个属性的enumerable为false,下面三个操作不会取到该属性。
因此,enumerable可以用来设置“秘密”属性。
configurable
configurable(可配置性)返回一个布尔值,决定了是否可以修改属性描述对象。也就是说,configurable为false时,value、writable、enumerable和configurable都不能被修改了。也决定了目标属性是否可以被删除(delete)。
存取器
除了直接定义以外,属性还可以用存取器(accessor)定义。其中,存值函数称为setter,使用属性描述对象的set属性;取值函数称为getter,使用属性描述对象的get属性。
JavaScript 还提供了存取器的另一种写法:
存取器往往用于,属性的值依赖对象内部数据的场合。
对象的拷贝
控制对象状态
有时需要冻结对象的读写状态,防止对象被改变。JavaScript 提供了三种冻结方法,最弱的一种是Object.preventExtensions,其次是Object.seal,最强的是Object.freeze。
用途是,确认某个对象没有被冻结后,再对它的属性赋值。
Object.prototype.toString()
作用是返回一个对象的字符串形式,默认情况下返回类型字符串。常用语判断数据类型。
例如:
封装方法:
Array
reduce(),reduceRight()
reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。
a默认是数组的第一个元素,此时b为数组第二个元素。也可以像下面这样指定初始的a,则b初始是数组第一个元素:
JSON
JSON.stringify(obj, null, params)
第三个参数,用于增加返回的 JSON 字符串的可读性。如果是数字,表示每个属性前面添加的空格(最多不超过10个);如果是字符串(不超过10个字符),则该字符串会添加在每行前面。
参考
属性描述对象
The text was updated successfully, but these errors were encountered: