目录

1. 介绍:阐述 Object 对象。

2. 构造函数:介绍 Object 对象的构造函数。

3. 实例属性:介绍 Object 对象的实例属性:prototype、constructor等等。

4. 实例方法:介绍 Object 对象的实例方法: hasOwnProperty、isPrototypeOf、propertyIsEnumerable等等。

5. 静态方法:介绍 Object 对象的静态方法:Object.create()、Object.defineProperties()等等。

6. 属性描述符:介绍属性描述符的类别:数据属性与访问器属性。

1. 介绍

  Object对象,是所有JavaScript对象的超类(基类)。Object.prototype(Obecjt的原型)定义了Js对象的基本方法和属性。

2. 构造函数

2.1 new Object() :返回一个Object实例

2.2 new Object(value) :根据value的值,返回不同的对象(Number、Boolean、String)

参数:

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

返回值:

{Number、Boolean、String} 返回一个转换后的对象

示例 :

  1. var o = new Object(123);
  2. console.log(o); // => Number对象
  3. o = new Object(true);
  4. console.log(o); // => Boolean对象
  5. o = new Object('abc');
  6. console.log(o); // => String对象

3. 实例属性

3.1 __proto__ :设置或返回对象的原型对象(IE中不支持此属性)

说明:

1) 赋值时,对象继承新原型的所有方法和属性,以及新原型的原型链中的所有方法和属性。

2) 属性名称以两个下划线开始和结束。

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

示例:

  1. // 1.自定义对象多层继承
  2. function People(name) {
  3. this.name = name;
  4. }
  5.  
  6. function Student(age) {
  7. this.age = age;
  8. }
  9. Student.prototype = new People(); // 设置Student的原型为People对象
  10.  
  11. var s = new Student(22);
  12. console.log(s.__proto__); // => People 对象
  13. console.log(Student.prototype); // => People 对象
  14. console.log(s.__proto__ == Student.prototype); // => true
  15.  
  16. // 2.对象直接量
  17. var p = {}; // 等于new Object()
  18. console.log(p.__proto__ == Object.prototype); // => true

3.2 prototype :设置或返回对象类的原型对象

说明:

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

2)  Js内置对象(Array、Date等对象)都有一个只读的prototype属性。 可将属性和方法添加到原型中,但不能为内置对象分配其他原型。

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

示例:

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

3.3 constructor :表示创建此对象的构造函数

说明:

1) 设置或返回创建此对象的构造函数。

2) 若一个对象有多层继承,将返回最先调用的构造函数。

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

示例:

  1. // 1.内置对象
  2. var str = 'abc';
  3. console.log(str.constructor); // => function String 构造函数
  4. var o = {};
  5. console.log(o.constructor); // => function Object 构造函数
  6.  
  7. // 2.自定义对象多层继承 :constructor返回最先调用的构造函数
  8. function People(name) {
  9. this.name = name; // s对象初始化时,先调用People构造函数,再调用Student构造函数
  10. console.log('People调用');
  11. }
  12. function Student(age) {
  13. this.age = age;
  14. console.log('Student调用');
  15. }
  16. Student.prototype = new People(); // 设置Student的原型为People对象
  17.  
  18. var s = new Student(22);
  19. console.log(s.constructor); // => function People 构造函数

总结:__proto__、prototype、constructor 的关系

说明:

1) 对象的__proto__ 等于 类的prototype

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

示例:

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

  

4. 实例方法

4.1 hasOwnProperty(propertyName) :判断对象是否拥有一个指定名称的实例属性(非继承)

参数:

①propertyName {string} :属性名称。

返回值:

{bool} 判断对象是否拥有一个指定名称的本地定义(非继承)的属性;此方法不会检查对象原型链中的属性。

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

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

示例 :

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

4.2 isPrototypeOf(obejct) :判断某个原型是否出现在对象的原型链中

语法:

prototype.isPrototypeOf(object)

参数:

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

返回值:

{bool} 返回某个原型是否出现在对象的原型链中

true :是

false :不是

示例 :

  1. // 1.Obejct对象
  2. var o = new Object();
  3. console.log(Object.prototype.isPrototypeOf(o)); // => true :o为Obejct一个对象
  4.  
  5. // 2.Array
  6. var array = [1, 2, 3];
  7. console.log(Array.prototype.isPrototypeOf(array)); // => true :数组原型
  8. console.log(Object.prototype.isPrototypeOf(array)); // => true :Object是所有对象的基原型
  9.  
  10. // 3.自定义对象
  11. var People = function () {
  12. }
  13. var Student = function () {
  14. }
  15. // 设置Student类的原型为People
  16. Student.prototype = new People();
  17. var st = new Student();
  18. console.log(Student.prototype.isPrototypeOf(st)); // => true :st为Student一个对象
  19. console.log(People.prototype.isPrototypeOf(st)); // => true :Student的原型为People
  20. console.log(Object.prototype.isPrototypeOf(st)); // =>true :Object是所有对象的基原型

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

参数:

①propertyName {string} :属性名称

返回值:

{bool} 判断属性是否为实例属性并且是可枚举的(可用for/in循环枚举),不考虑原型链中的成员。

true :是

false :不是

示例 :

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

4.4 toLocaleString() :返回当前对象的一个本地化的字符串表示

4.5 toString() :返回当前对象的一个字符串表示形式

4.6 valueOf() :返回当前对象的原始值

参数:

返回值:

{object} 返回当前对象关联的原始值,若没有相关联的值,则返回对象本身

示例 :

  1. var a = [1, 2, 3];
  2. console.log(a.valueOf()); // => [1, 2, 3]
  3.  
  4. var b = true;
  5. console.log(b.valueOf()); // => true
  6.  
  7. var c = {};
  8. console.log(c.valueOf()); // => Object {}
  9.  
  10. var s = 'abc';
  11. console.log(s.valueOf()); // => abc
  12.  
  13. // 自定义个对象,重写valueOf
  14. var customObject = {};
  15. customObject.valueOf = function () {
  16. return '自定义对象';
  17. }
  18. console.log(customObject.valueOf()); // => 自定义对象

5. 静态方法

5.1 Object.create(prototype, propertyDescriptor):创建并返回一个指定原型和指定属性的对象

参数:

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

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

属性描述符:设置属性的一系列特性;

语法格式:

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

返回值:

{object} 返回一个指定原型和指定属性的对象

示例 :

  1. // 建立个自定义对象,设置name和age属性
  2. var obj = Object.create(null, {
  3. name: {
  4. value: 'tom',
  5. writable: true,
  6. enumerable: true,
  7. configurable: true
  8. },
  9. age: {
  10. value: 22
  11. }
  12. });
  13. console.log(obj.name); // => tom
  14. console.log(obj.age); // => 22
  15.  
  16. obj.age = 28;
  17. console.log(obj.age); // => 22 :age属性的writable默认为false,此属性为只读
  18.  
  19. for (p in obj) {
  20. console.log(p); // => name :只输出name属性;age属性的enumerable默认为false,不能通过for/in 枚举
  21. }

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

参数:

①object {object} :对象

②propertyDescriptor {propertyDescriptor} 属性描述符。

说明:

若对象包含此属性,则是修改此属性的特性;否则为为对象添加此属性。

示例 :

  1. var obj = {};
  2.  
  3. // 为对象添加name和age属性
  4. Object.defineProperties(obj, {
  5. name: {
  6. value: 'tom',
  7. enumerable: true
  8. },
  9. age: {
  10. value: 22,
  11. enumerable: true
  12. }
  13. });
  14. for (p in obj) {
  15. console.log(p); // => name、age :输出name和age属性
  16. }

  

5.3 Object.defineProperty(obj, propertyName, propertyDescriptor) :添加/修改对象指定属性的特性

参数:

①object {object} :对象

②propertyName {string} :属性的名称

③propertyDescriptor {propertyDescriptor} 属性描述符。

说明 :

若对象包含此属性,则是修改此属性的特性;否则为添加此属性。

示例:

  1. var obj = {};
  2. // 添加一个name属性
  3. Object.defineProperty(obj, 'name', {
  4. value: 'tom',
  5. writable: true,
  6. enumerable: true,
  7. configurable:true
  8. }
  9. );
  10. console.log(obj.name); // => tom :输出name属性的value的值

5.4 Object.freeze(object) :冻结对象,使其不能添加属性以及无法对现有的实例属性进行特性更改、值修改、属性删除等操作

参数:

①object {object} :对象

说明 :

1) 此操作不可逆,冻结后无法进行解封。

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

示例:

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

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

参数:

①object {object} :对象

②propertyName {propertyName} 属性名称

返回值:

{propertyDescriptor} 属性描述符对象

示例 :

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

  

5.6 Object.getOwnPropertyNames(object) :返回一个数组,包含对象的所有实例属性和方法,不包含原型继承的属性和方法

参数:

①object {object} :对象

返回值:

{Array} 一个数组,包含对象的所有实例属性和方法,不包含原型继承的属性和方法

示例 :

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

5.7 Object.getPrototypeOf(object) :返回对象的上一级原型

参数:

①object {object} :对象

返回值:

{object} 返回原型对象

示例 :

  1. // 1.对象直接量
  2. var obj = {
  3. name: 'tom',
  4. age: 22,
  5. sayHello: function () {
  6. alert('Hello' + this.name);
  7. }
  8. };
  9. console.log(Object.getPrototypeOf(obj)); // => Object 对象:对象直接量的原型为Object
  10.  
  11. // 2.自定义对象
  12. var People = function (name) {
  13. this.name = name;
  14. };
  15.  
  16. var p = new People('tom');
  17. var people = Object.getPrototypeOf(p);
  18. console.log(people); // => People 对象:new 创建的对象使用构造函数的prototype属性作为他们的原型
  19. 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()包含了可枚举和不可枚举的成员

示例 :

  1. var obj = {
  2. name: 'tom',
  3. age: 22,
  4. sayHello: function () {
  5. alert('Hello' + this.name);
  6. }
  7. };
  8.  
  9. // 1)getOwnPropertyNames与keys方法返回的内容都相同
  10. console.log(Object.getOwnPropertyNames(obj)); // => ["name", "age", "sayHello"] :返回对象的所有实例成员
  11. console.log(Object.keys(obj)); // => ["name", "age", "sayHello"] :返回对象的所有可枚举成员
  12.  
  13. // 设置对象的name属性不可枚举
  14. Object.defineProperty(obj, 'name', {
  15. enumerable: false
  16. }
  17. );
  18.  
  19. // 2)keys方法,只包含可枚举成员
  20. console.log(Object.getOwnPropertyNames(obj)); // => ["name", "age", "sayHello"] :返回对象的所有实例成员
  21. console.log(Object.keys(obj)); // => ["age", "sayHello"] :返回对象的所有可枚举成员

5.12 Object.preventExtensions(object) :设置对象不能添加新的属性

参数:

①object {object} :对象

返回值:

{object} 返回此对象

示例 :

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

5.13 Object.seal(object) :密封对象,使其无法修改现有属性的特性以及不能添加新的属性

参数:

①object {object} :对象

返回值:

{object} 返回此对象

示例 :

  1. var obj = {
  2. name: 'tom',
  3. age: 22
  4. };
  5. Object.seal(obj); // 密封对象
  6. obj.email = '123@qq.com';
  7. console.log(obj.email); // => undefined :无法向对象添加新的属性
  8.  
  9. // 报异常:无法修改对象属性的特性
  10. Object.defineProperty(obj, 'name', {
  11. enumerable: false
  12. }
  13. );

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. // 1)对象直接量;属性特性默认为true
  2. var o1 = {
  3. name: 'tom'
  4. };
  5. console.log(Object.getOwnPropertyDescriptor(o1, 'name')); // => Object {value: "tom", writable: true, enumerable: true, configurable: true}
  6.  
  7. // 2)通过Object.create创建,属性特性默认为false
  8. var o2 = Object.create(null, {
  9. name: {value:'tom'}
  10. });
  11. 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

示例:

  1. var obj = {};
  2.  
  3. // 添加一个属性,并设置为访问器属性
  4. Object.defineProperty(obj, "name", {
  5. get: function () {
  6. return this._name; // get和set里的变量不要使用属性,如:属性为name,get和set用的是_name
  7. },
  8. set: function (x) {
  9. if (isNaN(x)) {
  10. this._name = x;
  11. } else {
  12. this._name = 'name不能为纯数字';
  13. }
  14. },
  15. enumerable: true,
  16. configurable: true
  17. });
  18.  
  19. console.log(Object.getOwnPropertyDescriptor(obj, 'name')); // => Object {get: function, set: function, enumerable: true, configurable: true}
  20. obj.name = '12';
  21. console.log(obj.name); // => name不能为纯数字
End
菜单加载中...

JavaScript Object对象的更多相关文章

  1. JavaScript Object 对象

    Object 对象自身用处不大,不过在了解其他类之前,还是应该了解它.因为 ECMAScript 中的 Object 对象与 Java 中的 java.lang.Object 相似,ECMAScrip ...

  2. javascript: Object对象生成URL参数

    code: function makeQuery(queryObject) { const query = Object.entries(queryObject) .reduce((result, e ...

  3. Javascript Object、Function对象

    1.Object对象 原型对象 原型是对象的一个属性,也就是prototype属性,每个对象都有这个内部属性,而且他本身也是一个对象. <script type="text/javas ...

  4. javascript ES5 Object对象

    原文:http://javascript.ruanyifeng.com/stdlib/object.html 目录 概述 Object对象的方法 Object() Object.keys(),Obje ...

  5. 详解JavaScript中的Object对象

    Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是 ...

  6. Javascript控制台打印Object对象

    Javascript控制台打印Object对象 做项目的时候遇到一个问题,在调试代码时需要打印对象来查看具体数值,想了各种方法也没有实现,最后查资料知道了可以使用JSON.stringify()将ob ...

  7. JSON(JavaScript Object Notation, JS 对象标记)

    JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言 ...

  8. JavaScript 复制对象【Object.assign方法无法实现深复制】

    在JavaScript这门语言中,数据类型分为两大类:基本数据类型和复杂数据类型.基本数据类型包括Number.Boolean.String.Null.String.Symbol(ES6 新增),而复 ...

  9. JavaScript:对Object对象的一些常用操作总结

    JavaScript对Object对象的一些常用操作总结. 一.Object.assign() 1.可以用作对象的复制 var obj = { a: 1 }; var copy = Object.as ...

随机推荐

  1. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

  2. linux基础学习笔记

    我用的是centOS7.0版本的系统.linux的shell终端窗口类似于wind的command窗口 shell命令提示符格式:用户名@主机名:目录名 提示符 @前面的是已登录的用户名,@之后的为计 ...

  3. 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  4. H5程序员如何利用cordova开发跨平台应用

    什么是Cordova? Cordova以前也叫PhoneGap,它提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还 ...

  5. 代码的坏味道(16)——纯稚的数据类(Data Class)

    坏味道--纯稚的数据类(Data Class) 特征 纯稚的数据类(Data Class) 指的是只包含字段和访问它们的getter和setter函数的类.这些仅仅是供其他类使用的数据容器.这些类不包 ...

  6. 【开发软件】 在Mac下配置php开发环境:Apache+php+MySql

    本文地址 原文地址   本文提纲: 1. 启动Apache 2. 运行PHP 3. 配置Mysql 4. 使用PHPMyAdmin 5. 附录   有问题请先 看最后的附录   摘要: 系统OS X ...

  7. 【Linux大系】Linux的概念与体系

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 我在这一系列文章中阐述Linux的基 本概念.Linux操作系统继承自UNIX.一个操作系统是一套控制和使用计算 ...

  8. JQuery实现表格的增加行和删除行

    利用JQuery实现datatables插件的增加和删除行操作 在学习过程中遇到了这个利用JQuery对表格行的增加和删除,特记录下来以供初学者参考. 下面是主要的代码: <meta http- ...

  9. 【干货分享】流程DEMO-合同会审表

    流程名: 合同会审表  业务描述: 合同的审批及签订  流程相关文件: 流程包.xml 事务呈批表业务服务.xml 事务呈批表主数据.xml  流程说明: 1.此流程必须先进行事务呈批表流程的配置才可 ...

  10. iOS之计算上次日期距离现在多久, 如 xx 小时前、xx 分钟前等

    /**  *  计算上次日期距离现在多久  *  *  @param lastTime    上次日期(需要和格式对应)  *  @param format1     上次日期格式  *  @para ...