【亚洲必赢官网】深入摸底对象中的属性

Object对象

  本篇首要介绍JS中指标的习性,包涵:属性的分类、访谈格局、检查评定属性、遍历属性以及品质性子等内容。

1. 介绍

  Object对象,是兼具JavaScript对象的超类(基类)。Object.prototype(Obecjt的原型)定义了Js对象的中坚措施和总体性。

目录

1.
介绍:描述属性的命超形式、查找路线以及分类

2.
性子的访谈格局:介绍’.’访谈方式、'[
]’中括号访问形式

3.
删除属性【亚洲必赢官网】深入摸底对象中的属性。:通过delete关键字删除对象的某部属性

4.
检验属性:介绍三种判断有些属性是或不是为指标的实例属性:in、obj.hasOwnProperty、obj.propertyIsEnumerable

5.
遍历属性:介绍两种遍历对象的性质:for
/ in 语句块、Object.keys(obj) 、Object.getOwnPropertyNames(obj)

6.
品质性子:在Escript5中,扩张了性能性子这一剧情,可设置属性是或不是可枚举、可修改等特点

 

2. 构造函数

1. 介绍

2.1 new Object() :重回贰个Object实例

1.1 描述

  属性,特指对象的成员,不单单为’属性'(字段),也富含了主意。

 

2.2 new Object(value) :根据value的值,再次回到分歧的靶子(Number、Boolean、String)

参数:

①value {number | bool | string} :三个数字、布尔值或许字符串

返回值:

{Number、Boolean、String} 重返一个转变后的指标

示例 :

var o = new Object(123);  console.log(o); // => Number对象  o = new Object(true);  console.log(o); // => Boolean对象  o = new Object('abc');  console.log(o); // => String对象

 

 

1.2 命名方式

品质名称可以包蕴德文字符、数字(不可能初步)、特殊符号(如:-、_、$等等)。

但貌似采纳纯匈牙利(Hungary)语字符,在出色处境下会增加-(横杠:-webkit-、-moz- )以及
_(下划线)。

若属性名称富含了-(横杠),属性访问方式只可以使用'[ ]’中括号访谈:

var o = {
    x: 1,
    y: 2,
    '-x': 3,
    '-showX': function () {
        alert(this.x);
    }
}
// o.-x; // 此访问方式会报异常
console.log(o['-x']); // => 3 :读取带-(横杠)名称的属性,只能采用'[ ]'中括号访问方式
o['-showX'](); // => 弹出1 :若方法名称带-(横杠),执行方式很别扭

 

3. 实例属性

1.3 属性的探寻路线

  倘若读取有些对象的属性x,首先会在此指标的实例属性中查找。若没有找到,将会在此目的的原型对象中检索属性x。若原型对象也未曾属性x,将三番五次查找这一个原型对象的原型(假诺原型对象涵盖原型),一向到找到属性x恐怕无原型甘休。

 

3.1 __亚洲必赢官网,proto__ :设置或重临对象的原型对象(IE中不支持此属性)

说明:

1)
赋值时,对象承继新原型的有着办法和品质,以及新原型的原型链中的兼具办法和总体性。

2) 属性名称以多个下划线早先和得了。

3) 对象的__proto__ == 对象类的prototype

示例:

// 1.自定义对象多层承接 function People(name) { this.name = name; }
function Student(age) { this.age = age; } Student.prototype = new
People(); // 设置Student的原型为People对象 var s = new Student(22);
console.log(s.__proto__); // => People 对象
console.log(Student.prototype); // => People 对象
console.log(s.__proto__ == Student.prototype); // => true //
2.指标间接量 var p = {}; // 等于new Object()
console.log(p.__proto__ == Object.prototype); // => true

 

 

1.4 属性的分类

目的中的属性,依照是或不是自个儿的可分为自有总体性和延续属性。

① 自有总体性:也可叫实例属性;指目的自己的品质。

② 承袭属性:也可叫原型属性;指目的从原型中继续的性质。

 

3.2 prototype :设置或重临对象类的原型对象

说明:

1) prototype为对象类的属性。__proto__是对象的属性。

2)  Js内置对象(Array、Date等指标)都有三个只读的prototype属性。
可将质量和艺术加多到原型中,但不能够为停放对象分配别的原型。

3) 自定义对象的prototype属性可举行读写操作。

示例:

var Student = function (name) {      this.name = name;  };  // 给Student的原型添加一个sayHello方法  Student.prototype.sayHello = function () {      alert('Hello,' + this.name);  }  var st = new Student('张三'); // 初始化对象st  console.log(st.name); // => 张三  st.sayHello(); // 弹出:Hello,张三

 

 

2. 质量的采访情势

可分为 ‘ . ‘点访谈格局和’ [ ] ‘中括号方法情势 。

说明:若读取叁个海市蜃楼的本性,将重临undefined。若设置一个对象一纸空文的属性,将会向指标添加此属性。

3.3 constructor :表示创制此目的的构造函数

说明:

1) 设置或重回创造此目的的构造函数。

2) 若三个目的有多层承接,将再次来到先河调用的构造函数。

3) obj.constructor.prototype 可代表对象的原型。

示例:

// 1.内置对象  var str = 'abc';  console.log(str.constructor); // => function String 构造函数  var o = {};  console.log(o.constructor); // => function Object 构造函数    // 2.自定义对象多层继承 :constructor返回最先调用的构造函数  function People(name) {      this.name = name; // s对象初始化时,先调用People构造函数,再调用Student构造函数      console.log('People调用');  }  function Student(age) {      this.age = age;      console.log('Student调用');  }  Student.prototype = new People(); // 设置Student的原型为People对象    var s = new Student(22);  console.log(s.constructor); // => function People 构造函数

 

 

2.1 ‘ . ‘点访谈格局 

语法:obj.propertyName

说明:质量名称必须为二个标示符(静态字符串),不能够为变量。

示例:

var o = {};
o.x = '1';

 

总结:__proto__、prototype、constructor 的关系

说明:

1) 对象的__proto__ 等于 类的prototype

2) 对象的constructor 等于 类,所以obj.constructor.prototype
可代表对象的原型。

示例:

var o = {};  console.log(o.__proto__ === Object.prototype); // true :对象的__proto__等于类的prototype  console.log(o.constructor === Object); // true :对象的constructor 等于 类  console.log(o.constructor.prototype === Object.prototype); // true :o.constructor.prototype 可表示对象的原型。

 

  

2.2 ‘ [ ] ‘中括号访问方式

语法:obj[propertyName]

说明:品质名称可以为三个静态字符串,也可以为一个变量。若为变量,访问的属性为变量表示的值。

特点:与’.’访谈方式分歧,'[
]’中括号访谈方式灵活性不小:可动态访谈(变量钦点属性名)、可访谈包罗有些特殊字符的习性(如:属性名称带’-‘)

示例:

var o = { x: 1, y: 2 };
console.log(o['x']); // => 1 :访问x属性
var a = 'y';
console.log(o[a]); // => 2 :访问的是y属性(变量a的值)

 

4. 实例方法

3. delete 删除属性

语法:delete obj.propertyName 或者 delete obj[propertyName]

说明:delete只好删除对象的自有质量,不可能去除承继属性。

示例:

var o = {};
o.x = '1';
console.log(o.x); // => 1
delete o.x;
console.log(o.x); // => undefined :访问不存在的属性,返回undefined

o.constructor.prototype.y = '2'; // 在原型对象上添加一个y属性
console.log(o.y); // => 2
delete o.y; // 删除继承属性y
console.log(o.y); // => 2 :还是可以访问继承属性y

 

4.1 hasOwnProperty(propertyName) :推断目的是不是具备多个点名名称的实例属性(非承袭)

参数:

①propertyName {string} :属性名称。

返回值:

{bool}
判断目的是还是不是具有八个内定名称的本土定义(非承接)的习性;此办法不会检核查象原型链中的属性。

true :属性为对象的实例属性,非承袭。

false :属性不为对象的实例属性。

示例 :

// 1.Object对象  var o = new Object();  o.name = '自定义属性'; // 定义一个实例属性  console.log(o.hasOwnProperty('name')); // => true:name属性为实例o自己定义的,而非继承  console.log(o.hasOwnProperty('toString')); // => false:toString为继承属性    // 2.自定义对象  var Student = function (name) {      this.name = name;  };  // 给Student的原型添加一个sayHello方法  Student.prototype.sayHello = function () {      alert('Hello,' + this.name);  }  // 给Student的原型添加一个age属性  Student.prototype.age = '';    var st = new Student('张三'); // 初始化对象st  console.log(st.hasOwnProperty('name')); // => true :调用构造函数时,通过this.name附加到实例对象上  console.log(st.hasOwnProperty('sayHello')); // => false :sayHello方法为原型上的成员  console.log(st.hasOwnProperty('age')); // => false :age属性为原型上的成员

 

 

4. 检验属性

  检查评定对象是不是带有有个别属性。

4.2 isPrototypeOf(obejct) :决断某些原型是不是出现在目的的原型链中

语法:

prototype.isPrototypeOf(object)

参数:

①obejct {object} :被检验的对象。

返回值:

{bool} 再次来到有个别原型是不是出现在指标的原型链中

true :是

false :不是

示例 :

// 1.Obejct对象  var o = new Object();  console.log(Object.prototype.isPrototypeOf(o)); // => true :o为Obejct一个对象    // 2.Array  var array = [1, 2, 3];  console.log(Array.prototype.isPrototypeOf(array)); // => true :数组原型  console.log(Object.prototype.isPrototypeOf(array)); // => true :Object是所有对象的基原型    // 3.自定义对象  var People = function () {  }  var Student = function () {  }  // 设置Student类的原型为People  Student.prototype = new People();  var st = new Student();  console.log(Student.prototype.isPrototypeOf(st)); // => true :st为Student一个对象  console.log(People.prototype.isPrototypeOf(st)); // => true :Student的原型为People  console.log(Object.prototype.isPrototypeOf(st)); // =>true :Object是所有对象的基原型

 

 

4.1 in 运算符

说明:剖断指标是还是不是带有有个别属性,会从指标的实例属性、承继属性里实行检查实验。

语法:propertyName in obj

返回值:

{bool} 判别指标的实例属性或再而三是不是包罗此属性。

true:对象的实例属性或三番两次属性包蕴此属性;

false:对象的实例属性或延续属性不包涵此属性。 

示例:

function People(name) {
    this.name = name;
}
function Student(age) {
    this.age = age;
}
Student.prototype = new People(); // 设置Student的原型为People对象

var s = new Student(22);

console.log('age' in s); // => true :age为实例属性
console.log('name' in s); // => true :name为继承属性
console.log('address' in s); // => false :address不存在此对象呢,返回false

 

4.3 propertyIsEnumerable(propertyName) :剖断内定名称的属性是或不是为实例属性并且是可枚举的(可用for/in循环枚举)

参数:

①propertyName {string} :属性名称

返回值:

{bool}
决断属性是不是为实例属性並且是可枚举的(可用for/in循环枚举),不考虑原型链中的分子。

true :是

false :不是

示例 :

// 1.Array对象  var array = [1, 2, 3];  array.name = 'Array';  console.log(array.propertyIsEnumerable('name')); // => true :name属性为实例属性  console.log(array.propertyIsEnumerable('join')); // => false :join方法继承自Array  console.log(array.propertyIsEnumerable('length')); // => false :length属性继承自Array  console.log(array.propertyIsEnumerable('toString')); // => false :toString方法继承自Object    // 2.自定义对象  var Student = function (name) {      this.name = name;  }  // 定义一个原型方法  Student.prototype.sayHello = function () {      alert('Hello' + this.name);  };  var a = new Student('tom');  console.log(a.propertyIsEnumerable('name')); // => true :name为自身定义的实例属性  console.log(a.propertyIsEnumerable('age')); // => false :age属性不存在,也返回false  console.log(a.propertyIsEnumerable('sayHello')); // => false :sayHello属于原型方法

 

 

4.2 obj.hasOwnProperty(propertyName) 

说明:看清指标是或不是享有三个点名名称的实例属性,不会检查一而再属性。

参数:

①propertyName {string} :属性名称。

语法:obj.hasOwnProperty(propertyName) 

返回值: 

{bool}
判别指标是或不是有所三个点名名称的实例属性;此办法不会检核查象原型链中的属性。

true :属性为对象的实例属性,非承继。

false :属性不为对象的实例属性。

示例:

var Student = function (name) {
    this.name = name;
};
// 给Student的原型添加一个sayHello方法
Student.prototype.sayHello = function () {
    alert('Hello,' + this.name);
}
// 给Student的原型添加一个age属性
Student.prototype.age = '';

var st = new Student('张三'); // 初始化对象st
console.log(st.hasOwnProperty('name')); // => true :调用构造函数时,通过this.name附加到实例对象上
console.log(st.hasOwnProperty('sayHello')); // => false :sayHello方法为原型上的成员
console.log(st.hasOwnProperty('age')); // => false :age属性为原型上的成员

 

4.4 toLocaleString() :再次回到当前指标的贰个本地化的字符串表示

4.3 obj.propertyIsEnumerable(propertyName)

说明:判定钦赐名称的质量是不是为实例属性并且是可枚举的(可用for/in循环枚举)

参数:

①propertyName {string} :属性名称。

语法:obj.propertyIsEnumerable(propertyName)

返回值:

{bool} 决断属性是还是不是为实例属性而且是可枚举的(可用for/in循环枚举),不考虑原型链中的积极分子。

true :属性为对象的实例属性况兼是可枚举的。

false :属性不为对象的实例属性或不计其数的。

示例:

var o = Object.create({}, {
    name: {
        value: 'tom',
        enumerable: true // 可枚举
    },
    age: {
        value: 22,
        enumerable: false // 不可枚举
    }
});

console.log(o.propertyIsEnumerable('name')); // => true :name为实例属性并且可枚举
console.log(o.propertyIsEnumerable('age')); // => false :age为实例属性但不可枚举

console.log(o.hasOwnProperty('age')); // => true :hasOwnProperty()方法只判断属性是否为实例属性

 

4.5 toString() :再次回到当前目的的三个字符串表示情势

总结

检测方式 语法 检测属性的范围   返回值
in 运算符 propertyName in obj 实例属性、继承属性 {bool} true:符合条件;fasle:不符合
obj.hasOwnProperty(propertyName)  obj.hasOwnProperty(propertyName)  实例属性 {bool} true:符合条件;fasle:不符合
obj.propertyIsEnumerable(propertyName) obj.propertyIsEnumerable(propertyName) 可枚举的实例属性 {bool} true:符合条件;fasle:不符合

 

4.6 valueOf() :再次回到当前指标的原始值

参数:

返回值:

{object} 重临当前指标关系的原始值,若未有相关联的值,则赶回对象自己

示例 :

var a = [1, 2, 3];  console.log(a.valueOf()); // => [1, 2, 3]    var b = true;  console.log(b.valueOf()); // => true    var c = {};  console.log(c.valueOf()); // => Object {}    var s = 'abc';  console.log(s.valueOf()); // => abc    // 自定义个对象,重写valueOf  var customObject = {};  customObject.valueOf = function () {      return '自定义对象';  }  console.log(customObject.valueOf()); // => 自定义对象

 

 

5. 遍历属性

  即遍历对象的实例属性、承接属性。

5. 静态方法

5.1 for / in 语句块

说明:遍历对象可枚举的实例属性和继续属性

语法:

for (p in obj) {
  // p表示遍历的习性名称
}

示例:

var po = { px: 1, py: 2 };
var o = { x: 1, y: 2 };
o.__proto__ = po; // 设置o的原型为po
for (property in o) {
    console.log(property); // => 输出属性的名称:x、y、px、py
    console.log(o[property]); // => 采用中括号访问方式,输出属性的值
}

 

5.1 Object.create(prototype, propertyDescriptor):成立并回到三个点名原型和点名属性的对象

参数:

①prototype {prototype}
:再次回到对象的原型,可以为null。若为null,对象的原型为undefined。

②propertyDescriptor {propertyDescriptor} 可选:属性描述符。

性格描述符:设置属性的一雨后春笋性格;

语法格式:

propertyName: {      value: '', // 设置此属性的值      writable: true, // 设置此属性是否可写入;默认为false:只读      enumerable: true, // 设置此属性是否可枚举(通过for/in预付);默认为false:不可枚举      configurable: true // 设置此属性是否可配置;如:是否可以修改属性的特性及删除属性。默认为false  }

 

返回值:

{object} 重临一个点名原型和点名属性的目的

示例 :

// 建立个自定义对象,设置name和age属性  var obj = Object.create(null, {      name: {          value: 'tom',          writable: true,          enumerable: true,          configurable: true      },      age: {          value: 22      }  });  console.log(obj.name); // => tom  console.log(obj.age); // => 22    obj.age = 28;  console.log(obj.age); // => 22 :age属性的writable默认为false,此属性为只读    for (p in obj) {      console.log(p); // => name :只输出name属性;age属性的enumerable默认为false,不能通过for/in 枚举  }

 

 

5.2 Object.keys(obj) 

说明:回去一个数组,包蕴对象可枚举的实例属性名称

参数:

①obj {object} :实例对象

返回值:

{Array} 再次回到贰个数组,包含对象可枚举的实例属性名称

示例:

var po = { px: 1, py: 2 };
var o = { x: 1, y: 2 };
o.__proto__ = po; // 设置o的原型为po
var propertyArray = Object.keys(o); // => 返回一个包含了可枚举的实例属性名称的数组
for (var i = 0, len = propertyArray.length; i < len; i++) {
    console.log(propertyArray[i]); // => 输出实例属性名称:x、y
}

 

5.2  Object.defineProperties(object, propertyDescriptor) :加多/修改对象贰个或八个属性的特点

参数:

①object {object} :对象

②propertyDescriptor {propertyDescriptor} 属性描述符。

说明:

若对象涵盖此属性,则是修改此属性的性状;不然为为对象加多此属性。

示例 :

var obj = {};    // 为对象添加name和age属性  Object.defineProperties(obj, {      name: {          value: 'tom',          enumerable: true      },      age: {          value: 22,          enumerable: true       }  });  for (p in obj) {      console.log(p); // => name、age :输出name和age属性  }

 

  

5.3 Object.getOwnPropertyNames(obj) 

注解:重临三个数组,满含对象的装有实例属性名称。蕴含可枚举和见惯司空的

参数:

①obj {object} :实例对象

返回值:

{Array} 重返三个数组,包罗对象具有实例属性名称

与Object.keys()的距离:Object.keys()只回去可枚举的实例属性,Object.getOwnPropertyNames()再次来到全体实例属性

示例:

var po = { px: 1, py: 2 };
var o = { x: 1, y: 2 };
// 设置对象o的属性特性:属性x为可枚举,属性y为不可枚举
Object.defineProperties(o, {
    x: {
        enumerable: true
    },
    y: {
        enumerable: false
    }
});
o.__proto__ = po; // 设置o的原型为po

// 1.Object.keys():获取一个可枚举的实例属性名称的数组
var propertyArray = Object.keys(o);
for (var i = 0, len = propertyArray.length; i < len; i++) {
    console.log(propertyArray[i]); // => 输出实例属性名称:x 
}

// 2.Object.getOwnPropertyNames():获取一个包含的实例属性名称的数组,不管实例属性是否可枚举
propertyArray = Object.getOwnPropertyNames(o);
for (var i = 0, len = propertyArray.length; i < len; i++) {
    console.log(propertyArray[i]); // => 输出实例属性名称:x、y
}

 

5.3 Object.defineProperty(obj, propertyName, propertyDescriptor) :增多/修改对象内定属性的表征

参数:

①object {object} :对象

②propertyName {string} :属性的称号

③propertyDescriptor {propertyDescriptor} 属性描述符。

说明 :

若对象涵盖此属性,则是修改此属性的性状;不然为丰盛此属性。

示例:

var obj = {};  // 添加一个name属性  Object.defineProperty(obj, 'name', {          value: 'tom',          writable: true,          enumerable: true,          configurable:true      }  );  console.log(obj.name); // => tom :输出name属性的value的值

 

 

总结

检测方式 语法 遍历属性的范围   返回值
for / in 语句块 for (p in obj) {
  // p表示遍历的属性名称
}
可枚举的实例属性和继承属性 {String} 属性的名称
Object.keys(obj) Object.keys(obj) 可枚举的实例属性 {Array} 返回一个数组,包含对象可枚举的实例属性名称
Object.getOwnPropertyNames(obj) Object.getOwnPropertyNames(obj) 包含对象的所有实例属性名称。包括可枚举和不可枚举的 {Array} 返回一个数组,包含对象所有实例属性名称

 

5.4 Object.freeze(object) :冻结对象,使其不可能增添属性以及不可能对现成的实例属性进行特色改换、值修改、属性删除等操作

参数:

①object {object} :对象

说明 :

1) 此操作不可逆,冻结后无法开始展览解封。

2) 只影响实例属性,不影响原型属性。

示例:

var obj = {      name: 'tom',      age: 22  };  Object.freeze(obj); // 冻结对象    obj.email = '123@qq.com';  console.log(obj.email); // undefined :无法添加属性  obj.age = 25;  console.log(obj.age); // 22 :无法设置属性的值

 

 

6.属性描述符

分为数据属性和拜候器属性;

双方可相互转变,若调换后未设置enumerable和configurable性情(两类性质描述符都包蕴那2本性状),将默许使用转变前的值。

5.5 Object.getOwnPropertyDescriptor(object, propertyName) :重返对象属性的叙述符

参数:

①object {object} :对象

②propertyName {propertyName} 属性名称

返回值:

{propertyDescriptor} 属性描述符对象

示例 :

var obj = {      name: 'tom',      age: 22  };    var propertyDes = Object.getOwnPropertyDescriptor(obj, 'name');  console.log(propertyDes); // => Object {value: "tom", writable: true, enumerable: true, configurable: true} :输出描述符对象

 

  

6.1 数据属性

说明:包括属性的操作脾气;如:设置值、是还是不是可枚举等等

特性名称 描述 默认值
value 设置属性的值 undefined
writable 是否可修改属性的值;true:可修改属性的值;false:不可修改属性的值 false  
enumerable 是否可枚举属性;true:可枚举,可通过for/in语句枚举属性;false:不可枚举 false
configurable 是否可修改属性的特性;true:可修改属性的特性(如把writable从false改为true);false:不可修改属性的特性 false

 

 

 

 

默认值:

1)在利用Object.defineProperty、Object.defineProperties 或 Object.create
函数的场合下添增添少属性,writable、enumerable和configurable暗许值为false。

2)使用对象直接量创立的性质,writable、enumerable和configurable天性默以为true。

示例:

// 1)对象直接量;属性特性默认为true
var o1 = {
    name: 'tom'
};
console.log(Object.getOwnPropertyDescriptor(o1, 'name')); // => Object {value: "tom", writable: true, enumerable: true, configurable: true}

// 2)通过Object.create创建,属性特性默认为false
var o2 = Object.create(null, {
    name: {value:'tom'}
});
console.log(Object.getOwnPropertyDescriptor(o2, 'name')); // => Object {value: "tom", writable: false, enumerable: false, configurable: false}

 

5.6 Object.getOwnPropertyNames(object) :再次回到贰个数组,富含对象的有所实例属性和章程,不富含原型承继的习性和措施

参数:

①object {object} :对象

返回值:

{Array} 一个数组,包含对象的保有实例属性和办法,不带有原型承继的习性和章程

示例 :

var obj = {      name: 'tom',      age: 22,      sayHello: function () {          alert('Hello' + this.name);      }  };  console.log(Object.getOwnPropertyNames(obj)); // => ["name", "age", "sayHello"] :返回对象的实例成员

 

 

6.2 访谈器属性

说明:安装属性的访问情势;set、get特性等

特性名称 描述 默认值
get 属性的返回值函数 undefined
set 属性的设置值函数;含有一个赋值参数 undefined
enumerable 是否可枚举属性;true:可枚举,可通过for/in语句枚举属性;false:不可枚举 false
configurable 是否可修改属性的特性;true:可修改属性的特性(如把writable从false改为true);false:不可修改属性的特性 false

 

 

 

 

示例:

var obj = {};

// 添加一个属性,并设置为访问器属性
Object.defineProperty(obj, "name", {
    get: function () {
        return this._name; // get和set里的变量不要使用属性,如:属性为name,get和set用的是_name
    },
    set: function (x) {
        if (isNaN(x)) {
            this._name = x;
        } else {
            this._name = 'name不能为纯数字';
        }
    },
    enumerable: true,
    configurable: true
});

console.log(Object.getOwnPropertyDescriptor(obj, 'name')); // => Object {get: function, set: function, enumerable: true, configurable: true} 
obj.name = '12';
console.log(obj.name); // => name不能为纯数字

 

End

Web开荒之路体系文章

美食指南加载中…

5.7 Object.getPrototypeOf(object) :重回对象的上拔尖原型

参数:

①object {object} :对象

返回值:

{object} 重临原型对象

示例 :

// 1.对象直接量  var obj = {      name: 'tom',      age: 22,      sayHello: function () {          alert('Hello' + this.name);      }  };  console.log(Object.getPrototypeOf(obj)); // => Object 对象:对象直接量的原型为Object    // 2.自定义对象  var People = function (name) {      this.name = name;  };    var p = new People('tom');  var people = Object.getPrototypeOf(p);  console.log(people); // => People 对象:new 创建的对象使用构造函数的prototype属性作为他们的原型  console.log(Object.getPrototypeOf(people)); // => Object 对象:原型People的原型为Object

 

  

5.8 Object.isExtensible(object) :判定是还是不是可向对象加多新的个性

5.9 Object.isFrozen(object) :判别指标是否冻结;true:无法改改对象的存活属性特性和值何况无法增多新的属性

5.10 Object.isSealed(object) :决断目的是还是不是密封;true:无法修改对象的依存属性天性何况不能加多新的属性

 

5.11 Object.keys(object) :重返一个数组,富含对象的可枚举的实例属性名称

参数:

①object {object} :对象

返回值:

{Array} 再次来到贰个数组,满含对象可枚举的实例属性名称

说明:

此方式与getOwnPropertyNames()类似,但getOwnPropertyNames()满含了可枚举和成千上万的积极分子

示例 :

var obj = {      name: 'tom',      age: 22,      sayHello: function () {          alert('Hello' + this.name);      }  };    // 1)getOwnPropertyNames与keys方法返回的内容都相同  console.log(Object.getOwnPropertyNames(obj)); // => ["name", "age", "sayHello"] :返回对象的所有实例成员  console.log(Object.keys(obj)); // => ["name", "age", "sayHello"] :返回对象的所有可枚举成员    // 设置对象的name属性不可枚举  Object.defineProperty(obj, 'name', {          enumerable: false      }  );    // 2)keys方法,只包含可枚举成员  console.log(Object.getOwnPropertyNames(obj)); // => ["name", "age", "sayHello"] :返回对象的所有实例成员  console.log(Object.keys(obj)); // => ["age", "sayHello"] :返回对象的所有可枚举成员

 

  

5.12 Object.preventExtensions(object) :设置对象无法增加新的属性

参数:

①object {object} :对象

返回值:

{object} 重返此指标

示例 :

var obj = {      name: 'tom',      age: 22  };  Object.preventExtensions(obj); // 设置对象不能添加新的属性  obj.email = '123@qq.com';  console.log(obj.email); // => undefined :无法向对象添加新的属性

 

 

5.13 Object.seal(object) :密闭对象,使其无法修改现成属性的天性以及不能增添新的性质

参数:

①object {object} :对象

返回值:

{object} 重回此目的

示例 :

var obj = {      name: 'tom',      age: 22  };  Object.seal(obj); // 密封对象  obj.email = '123@qq.com';  console.log(obj.email); // => undefined :无法向对象添加新的属性    // 报异常:无法修改对象属性的特性  Object.defineProperty(obj, 'name', {          enumerable: false      }  );

 

 

6.属性描述符

分成数据属性和访谈器属性;

相互可相互调换,若转变后未设置enumerable和configurable天性(两类天性描述符都满含那2个特点),将暗中同意使用转变前的值。

6.1 数据属性

说明:含蓄属性的操作天性;如:设置值、是不是可枚举等等

特性名称 描述 默认值
value 设置属性的值 undefined
writable 是否可修改属性的值;true:可修改属性的值;false:不可修改属性的值 false  
enumerable 是否可枚举属性;true:可枚举,可通过for/in语句枚举属性;false:不可枚举 false
configurable 是否可修改属性的特性;true:可修改属性的特性(如把writable从false改为true);false:不可修改属性的特性 false

 

 

 

 

默认值:

1)在选拔Object.defineProperty、Object.defineProperties 或 Object.create
函数的场合下添扩展少属性,writable、enumerable和configurable私下认可值为false。

2)使用对象直接量成立的品质,writable、enumerable和configurable特性默感到true。

示例:

// 1)对象直接量;属性特性默认为true  var o1 = {      name: 'tom'  };  console.log(Object.getOwnPropertyDescriptor(o1, 'name')); // => Object {value: "tom", writable: true, enumerable: true, configurable: true}    // 2)通过Object.create创建,属性特性默认为false  var o2 = Object.create(null, {      name: {value:'tom'}  });  console.log(Object.getOwnPropertyDescriptor(o2, 'name')); // => Object {value: "tom", writable: false, enumerable: false, configurable: false}

 

 

6.2 访谈器属性

表明:设置属性的拜见格局;set、get性情等

特性名称 描述 默认值
get 属性的返回值函数 undefined
set 属性的设置值函数;含有一个赋值参数 undefined
enumerable 是否可枚举属性;true:可枚举,可通过for/in语句枚举属性;false:不可枚举 false
configurable 是否可修改属性的特性;true:可修改属性的特性(如把writable从false改为true);false:不可修改属性的特性 false

 

 

 

 

示例:

var obj = {};    // 添加一个属性,并设置为访问器属性  Object.defineProperty(obj, "name", {      get: function () {          return this._name; // get和set里的变量不要使用属性,如:属性为name,get和set用的是_name      },      set: function (x) {          if (isNaN(x)) {              this._name = x;          } else {              this._name = 'name不能为纯数字';          }      },      enumerable: true,      configurable: true  });    console.log(Object.getOwnPropertyDescriptor(obj, 'name')); // => Object {get: function, set: function, enumerable: true, configurable: true}   obj.name = '12';  console.log(obj.name); // => name不能为纯数字

 

 


网站地图xml地图