JS对象方法 create()
1 Object .create (proto,[propertiesObject])
描述 **Object.create()
**方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
参数 proto
新创建对象的原型对象。
propertiesObject
可选。需要传入一个对象,该对象的属性类型参照Object.defineProperties()
的第二个参数。如果该参数被指定且不为 undefined
,该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。
返回值 一个新对象,带着指定的原型对象和属性。
示例 用Object.create
实现类式继承 下面的例子演示了如何使用Object.create()
来实现类式继承。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 function Shape ( ) { this .x = 0 ; this .y = 0 ; } Shape .prototype .move = function (x, y ) { this .x += x; this .y += y; console .info ('Shape moved.' ); }; function Rectangle ( ) { Shape .call (this ); } Rectangle .prototype = Object .create (Shape .prototype );Rectangle .prototype .constructor = Rectangle ;var rect = new Rectangle ();console .log ('Is rect an instance of Rectangle?' , rect instanceof Rectangle ); console .log ('Is rect an instance of Shape?' , rect instanceof Shape ); rect.move (1 , 1 );
如果你希望能继承到多个对象,则可以使用混入的方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function MyClass ( ) { SuperClass .call (this ); OtherSuperClass .call (this ); } MyClass .prototype = Object .create (SuperClass .prototype );Object .assign (MyClass .prototype , OtherSuperClass .prototype );MyClass .prototype .constructor = MyClass ;MyClass .prototype .myMethod = function ( ) { };
使用Object.create
的propertyObject
参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 var o;o = Object .create (null ); o = {}; o = Object .create (Object .prototype ); o = Object .create (Object .prototype , { foo : { writable :true , configurable :true , value : "hello" }, bar : { configurable : false , get : function ( ) { return 10 }, set : function (value ) { console .log ("Setting `o.bar` to" , value); } } }); function Constructor ( ){}o = new Constructor (); o = Object .create (Constructor .prototype ); o = Object .create ({}, { p : { value : 42 } }) o.p = 24 o.p o.q = 12 for (var prop in o) { console .log (prop) } delete o.p o2 = Object .create ({}, { p : { value : 42 , writable : true , enumerable : true , configurable : true } });
defineProperty()
1 Object .defineProperty (obj, prop, descriptor)
描述 Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
该方法允许精确地添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,在枚举对象属性时会被枚举到(for...in
或 Object.keys
方法),可以改变这些属性的值,也可以删除
这些属性。
这个方法允许修改默认的额外选项(或配置)。默认情况下,使用Object.defineProperty()
添加的属性值是不可修改(immutable)的。
参数 obj
要定义属性的对象。
prop
要定义或修改的属性的名称或 Symbol
。
descriptor
要定义或修改的属性描述符。
返回值 被传递给函数的对象。
示例 1 2 3 4 5 6 7 8 9 const object1 = {};Object .defineProperty (object1, 'property1' , { value : 42 , writable : false }); object1.property1 = 77 ;
defineProperties()
1 Object .defineProperties (obj, props)
描述 Object.defineProperties()
方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
参数 obj
在其上定义或修改属性的对象。
props
要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器描述符(更多详情,请参阅Object.defineProperty()
)。描述符具有以下键:
configurable
true
只有该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。 默认为 false
enumerable
true
只有在枚举相应对象上的属性时该属性显现。 默认为 false
value
与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)。 默认为 undefined
.
writable
true
只有与该属性相关联的值被assignment operator (en-US) 改变时。 默认为 false
get
作为该属性的 getter 函数,如果没有 getter 则为undefined
。函数返回值将被用作属性的值。 默认为 undefined
set
作为属性的 setter 函数,如果没有 setter 则为undefined
。函数将仅接受参数赋值给该属性的新值。 默认为 undefined
返回值 传递给函数的对象。
示例 1 2 3 4 5 6 7 8 9 10 11 12 var obj = {};Object .defineProperties (obj, { 'property1' : { value : true , writable : true }, 'property2' : { value : 'Hello' , writable : false } });
freeze()
描述 Object.freeze()
方法可以冻结 一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze()
返回和传入的参数相同的对象。
参数 obj
要被冻结的对象。
返回值 被冻结的对象。
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 var obj = { prop : function ( ) {}, foo : 'bar' }; obj.foo = 'baz' ; obj.lumpy = 'woof' ; delete obj.prop ;var o = Object .freeze (obj);o === obj; Object .isFrozen (obj); obj.foo = 'quux' ; obj.quaxxor = 'the friendly duck' ; function fail ( ){ 'use strict' ; obj.foo = 'sparky' ; delete obj.quaxxor ; obj.sparky = 'arf' ; } fail ();Object .defineProperty (obj, 'ohai' , { value : 17 });Object .defineProperty (obj, 'foo' , { value : 'eit' });Object .setPrototypeOf (obj, { x : 20 })obj.__proto__ = { x : 20 }
getOwnPropertyNames()
1 Object .getOwnPropertyNames (obj)
描述 **Object.getOwnPropertyNames()
**方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。不会获取到原型链上的属性。
参数 obj
一个对象,其自身的可枚举和不可枚举属性的名称被返回。
返回值 在给定对象上找到的自身属性对应的字符串数组。
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 var arr = ["a" , "b" , "c" ];console .log (Object .getOwnPropertyNames (arr).sort ()); var obj = { 0 : "a" , 1 : "b" , 2 : "c" };console .log (Object .getOwnPropertyNames (obj).sort ()); Object .getOwnPropertyNames (obj).forEach (function (val, idx, array ) { console .log (val + " -> " + obj[val]); }); var my_obj = Object .create ({}, { getFoo : { value : function ( ) { return this .foo ; }, enumerable : false } }); my_obj.foo = 1 ; console .log (Object .getOwnPropertyNames (my_obj).sort ());
getPrototypeOf()
1 Object .getPrototypeOf (object)
描述 Object.getPrototypeOf()
方法返回指定对象的原型(内部[[Prototype]]
属性的值)。
参数 obj
要返回其原型的对象。
返回值 给定对象的原型。如果没有继承属性,则返回 null
。
示例 1 2 3 4 5 6 var proto = {};var obj = Object .create (proto);Object .getPrototypeOf (obj) === proto; var reg = /a/ ;Object .getPrototypeOf (reg) === RegExp .prototype ;
prototype.hasOwnProperty()
1 obj.hasOwnProperty (prop)
描述 hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。
参数 prop
要检测的属性的 String
字符串形式表示的名称,或者 Symbol
。
返回值 用来判断某个对象是否含有指定的属性的布尔值 Boolean
。
示例 使用 hasOwnProperty 方法判断属性是否存在 1 2 3 4 5 6 o = new Object (); o.hasOwnProperty ('prop' ); o.prop = 'exists' ; o.hasOwnProperty ('prop' ); delete o.prop ;o.hasOwnProperty ('prop' );
自身属性与继承属性 1 2 3 4 5 o = new Object (); o.prop = 'exists' ; o.hasOwnProperty ('prop' ); o.hasOwnProperty ('toString' ); o.hasOwnProperty ('hasOwnProperty' );
prototype.isPrototypeOf()
1 prototypeObj.isPrototypeOf (object)
描述 isPrototypeOf()
方法用于测试一个对象是否存在于另一个对象的原型链上。
参数 object
在该对象的原型链上搜寻
返回值 Boolean
,表示调用对象是否在另一个对象的原型链上。
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 function Foo ( ) {}function Bar ( ) {}function Baz ( ) {}Bar .prototype = Object .create (Foo .prototype );Baz .prototype = Object .create (Bar .prototype );var baz = new Baz ();console .log (Baz .prototype .isPrototypeOf (baz)); console .log (Bar .prototype .isPrototypeOf (baz)); console .log (Foo .prototype .isPrototypeOf (baz)); console .log (Object .prototype .isPrototypeOf (baz));
keys()
描述 Object.keys()
方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
参数 obj
要返回其枚举自身属性的对象。
返回值 一个表示给定对象的所有可枚举属性的字符串数组。
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var arr = ['a' , 'b' , 'c' ];console .log (Object .keys (arr)); var obj = { 0 : 'a' , 1 : 'b' , 2 : 'c' };console .log (Object .keys (obj)); var anObj = { 100 : 'a' , 2 : 'b' , 7 : 'c' };console .log (Object .keys (anObj)); var myObj = Object .create ({}, { getFoo : { value : function ( ) { return this .foo ; } } }); myObj.foo = 1 ; console .log (Object .keys (myObj));
values()
描述 Object.values()
方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in
循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
参数 obj
被返回可枚举属性值的对象。
返回值 一个包含对象自身的所有可枚举属性值的数组。
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var obj = { foo : 'bar' , baz : 42 };console .log (Object .values (obj)); var obj = { 0 : 'a' , 1 : 'b' , 2 : 'c' };console .log (Object .values (obj)); var an_obj = { 100 : 'a' , 2 : 'b' , 7 : 'c' };console .log (Object .values (an_obj)); var my_obj = Object .create ({}, { getFoo : { value : function ( ) { return this .foo ; } } });my_obj.foo = 'bar' ; console .log (Object .values (my_obj)); console .log (Object .values ('foo' ));