javascript 对象 实例-JavaScript 标准参考教程 (alpha)

对象对象

摘自《JavaScript标准参考教程(alpha)》,作者:阮一峰

目录

重要提示:本教程很久以前就已经搬迁,不再在这里维护。 请访问新网站: 。

概述

JavaScript原生提供了Object对象(注意首字母O是小写),本章介绍该对象的各种原生技术。

JavaScript 中的所有其他对象都继承自 Object 对象,也就是说,这些对象都是 Object 的实例。

Object对象的native方法分为两类:Object本身的方法和Object的实例技术。

(1)Object对象本身的方式

所谓“自己的方式”就是直接在Object对象中定义的方式。

Object.print = function (o) { console.log(o) };

上面的代码中,print方法直接定义在Object对象上。

(2) 对象实例方法

所谓实例方法就是在Object原型对象Object.prototype上定义的一种技术。 它可以直接被Object实例使用。

Object.prototype.print = function () {
  console.log(this);
};
var obj = new Object();
obj.print() // Object

上面的代码中,Object.prototype定义了打印技术,然后生成了一个Object实例obj。 obj直接继承了Object.prototype的属性和技术javascript 对象 实例,可以直接使用obj.print来调用打印技术。 换句话说,obj对象的print方法本质上是调用Object.prototype.print技术。

关于原型对象object.prototype的详细解释,请参见《面向对象编程》一章。 这里只要知道,Object.prototype对象中定义的所有属性和技能都会被所有实例对象共享。

下面首先介绍Object作为函数的用法,然后介绍Object对象的native方法,它分为两部分:对象自身的方法(也称为“静态方法”)和实例方法。

目的()

javascript 对象 实例_实例对象可以调用静态方法吗_实例对象和类对象的区别

对象本身是一个函数,可以用作将任何值转换为对象的工具。 此技术通常用于确保值必须是对象。

如果参数为空(或未定义且为 null),则 Object() 返回一个空对象。

var obj = Object();
// 等同于
var obj = Object(undefined);
var obj = Object(null);
obj instanceof Object // true

上面代码的意思是将undefined和null转为对象,结果是一个空对象obj。

instanceof 运算符用于验证对象是否是指定构造函数的实例。 obj instanceof Object 返回 true,这意味着 obj 对象是 Object 的实例。

如果参数是原始类型的值,则 Object 方法将其转换为相应包装对象的实例(请参阅“原始类型包装对象”一章)。

var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true
var obj = Object('foo');
obj instanceof Object // true
obj instanceof String // true
var obj = Object(true);
obj instanceof Object // true
obj instanceof Boolean // true

上面的代码中,Object函数的参数是各种原始类型的值,将其转换为对象就是原始类型值对应的包装对象。

如果Object方法的参数是对象,则始终返回该对象,即不进行转换。

var arr = [];
var obj = Object(arr); // 返回原数组
obj === arr // true
var value = {};
var obj = Object(value) // 返回原对象
obj === value // true
var fn = function () {};
var obj = Object(fn); // 返回原函数
obj === fn // true

利用这一点,您可以编写一个函数来确定变量是否是对象。

function isObject(value) {
  return value === Object(value);
}
isObject([]) // true
isObject(true) // false

对象构造函数

Object除了用作工具功能外,还可以用作构造函数,即上面可以使用new命令。

对象构造函数的主要目的是通过它直接生成新对象。

var obj = new Object();

请注意,通过编写 var obj = new Object() 生成新对象相当于为文字编写 var obj = {}。 换句话说,后者只是后者的简单写法。

实例对象可以调用静态方法吗_javascript 对象 实例_实例对象和类对象的区别

Object构造函数的用法和工具方法非常相似,几乎一模一样。 使用时,它可以接受一个参数。 如果参数是对象,则直接返回该对象; 如果是原始类型值,则返回该值对应的包装对象(详见“包装对象”章节)。

var o1 = {a: 1};
var o2 = new Object(o1);
o1 === o2 // true
var obj = new Object(123);
obj instanceof Number // true

虽然用法类似,但 Object(value) 和 new Object(value) 的语义不同。 Object(value)表示将value转换为对象,new Object(value)表示新生成一个对象。 它的价值就是价值。

对象的静态方法

所谓“静态方法”是指部署在Object对象本身上的方法。

Object.keys()、Object.getOwnPropertyNames()

Object.keys方法和Object.getOwnPropertyNames方法都用于遍历对象的属性。

Object.keys方法的参数是一个对象,返回一个链表。 这个链表的成员都是对象本身的属性名(不是继承的)。

var obj = {
  p1: 123,
  p2: 456
};
Object.keys(obj) // ["p1", "p2"]

Object.getOwnPropertyNames的方法与Object.keys类似。 它还接受一个对象作为参数,并返回一个包含该对象本身的所有属性名称的链表。

var obj = {
  p1: 123,
  p2: 456
};
Object.getOwnPropertyNames(obj) // ["p1", "p2"]

对于普通对象,Object.keys() 和 Object.getOwnPropertyNames() 返回的结果是相同的。 只有涉及到不可枚举属性时,结果才会不同。 Object.keys方法仅返回可枚举属性(详细信息请参见“对象属性描述”一章),Object.getOwnPropertyNames方法还返回非可枚举属性名称。

var a = ['Hello', 'World'];
Object.keys(a) // ["0", "1"]
Object.getOwnPropertyNames(a) // ["0", "1", "length"]

在上面的代码中,数组的length属性是一个不可枚举的属性,因此它只出现在Object.getOwnPropertyNames方法的返回结果中。

由于 JavaScript 没有提供估计对象属性数量的方法,因此可以使用这两种方法来代替。

var obj = {
  p1: 123,
  p2: 456
};
Object.keys(obj).length // 2
Object.getOwnPropertyNames(obj).length // 2

一般来说,Object.keys方法几乎都是用来遍历链表的属性的。

实例对象和类对象的区别_实例对象可以调用静态方法吗_javascript 对象 实例

其他方法

除了上面提到的两个方法之外,Object还有很多其他的静态方法,稍后会详细介绍。

(1)对象属性模型相关技巧

(2) 控制对象状态的方式

(3)原型链相关技巧

Object的实例模式

除了静态方法之外,Object.prototype 对象中还定义了很多方法。 它们称为实例方法,所有 Object 实例都继承此技术。

Object实例对象主要有以下六种方法。

本节介绍前四种方法,另外两种方法将在后面的相关章节中介绍。

Object.prototype.valueOf()

valueOf方法的作用是返回一个对象的“值”,默认情况下返回对象本身。

var obj = new Object();
obj.valueOf() === obj // true

上面的代码将 obj.valueOf() 与 obj 本身进行比较,两者是相同的。

valueOf方法的主要目的是在JavaScript中自动类型转换时默认会调用该方法(具体参见“数据类型转换”一章)。

var obj = new Object();
1 + obj // "1[object Object]"

上面的代码将对象 obj 乘以数字 1,然后 JavaScript 会默认调用 valueOf() 方法来查找 obj 的值,然后将其乘以 1。因此,如果自定义 valueOf 方法,则可以得到想要的值结果。

var obj = new Object();
obj.valueOf = function () {
  return 2;
};
1 + obj // 3

上面的代码自定义了obj对象的valueOf方法,所以1 + obj得到3。这个方法相当于使用自定义的obj.valueOf来覆盖Object.prototype.valueOf。

Object.prototype.toString()

toString方法的作用是返回一个对象的字符串方法。 默认情况下,返回字符串类型。

var o1 = new Object();
o1.toString() // "[object Object]"
var o2 = {a:1};
o2.toString() // "[object Object]"

上面的代码表明,对对象调用toString方法将返回一个字符串[object Object],该字符串描述了该对象的类型。

字符串[object Object]本身并没有太大的好处,但是通过自定义toString方法javascript 对象 实例,可以让对象在自动类型转换时得到想要的字符串方法。

var obj = new Object();
obj.toString = function () {
  return 'hello';
};
obj + ' ' + 'world' // "hello world"

上面的代码表示当该对象用于字符串分割时,会手动调用toString方法。 由于toString方法是自定义的,所以返回的是字符串hello world。

数组、字符串、函数和 Date 对象都部署了自定义 toString 方法,涵盖了 Object.prototype.toString 方法。

[1, 2, 3].toString() // "1,2,3"
'123'.toString() // "123"
(function () {
  return 123;
}).toString()
// "function () {
//   return 123;
// }"
(new Date()).toString()
// "Tue May 10 2016 09:11:31 GMT+0800 (CST)"

上面代码中,数组、字符串、函数、Date对象调用toString方法,但不会返回[object Object],因为它们都自定义了toString方法,覆盖了原来的方法。

toString()的应用:判断数据类型

Object.prototype.toString方法返回对象的字符串类型,因此可以用来确定值的类型。

var obj = {};
obj.toString() // "[object Object]"

上面的代码调用空对象的toString方法,结果是一个字符串对象Object,其中第二个Object代表值的构造函数。 这是识别数据类型的非常有用的技术。

由于实例对象可能会自定义toString方法并重写Object.prototype.toString方法,因此为了获取类型string,最好直接使用Object.prototype.toString技术。 通过函数的call方法,可以对任意值调用该方法,帮助我们判断该值的类型。

Object.prototype.toString.call(value)

上面的代码表明对值调用了 Object.prototype.toString 方法。

不同数据类型的Object.prototype.toString方法的返回值如下。

这意味着 Object.prototype.toString 可以判断值的类型。

Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"

使用此功能,您可以编写比 typeof 运算符更准确的类型确定函数。

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/[object (.*?)]/)[1].toLowerCase();
};
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"

在前面的类型函数的基础上,还可以添加一种方法来专门判断某种类型的数据。

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

Object.prototype.toLocaleString()

Object.prototype.toLocaleString方法返回的结果与toString相同,也是一个返回值的字符串方法。

var obj = {};
obj.toString(obj) // "[object Object]"
obj.toLocaleString(obj) // "[object Object]"

该方法的主要作用是为各个对象留下一个套接字来实现自己版本的toLocaleString,用于返回各个区域的特定值。 目前,主要有三个对象定制了 toLocaleString 技术。

例如,日期实例对象的toString和toLocaleString返回值是不同的,而toLocaleString的返回值与用户设置的区域有关。

var date = new Date();
date.toString() // "Tue Jan 01 2018 12:01:33 GMT+0800 (CST)"
date.toLocaleString() // "1/01/2018, 12:01:33 PM"

Object.prototype.hasOwnProperty()

Object.prototype.hasOwnProperty 方法接受一个字符串作为参数,并返回一个布尔值,指示实例对象本身是否具有该属性。

var obj = {
  p: 123
};
obj.hasOwnProperty('p') // true
obj.hasOwnProperty('toString') // false

上面的代码中,对象obj本身具有p属性,所以返回true。 toString属性是继承的,所以返回false。

参考链接