《JavaScript启示录》——1.18 构造函数实例都拥有指向其构造函数的Constructor属性

1.18 构造函数实例都拥有指向其构造函数的Constructor属性

任何对象实例化时,都是在幕后将constructor属性创建为对象/实例的属性。这是指创建对象的构造函数。下面创建一个Object()对象,保存在变量foo中,然后验证constructor属性在创建的对象中是否可用。

<!DOCTYPE html><html lang="en"><body><script>

var foo = {};
console.log(foo.constructor === Object) /* 输出true, 因为object()构建了                                          foo */
console.log(foo.constructor) // 指向Object()构造函数

</script></body></html>

如下功能非常方便:如果正在使用一些实例,而无法看到是谁或者是什么创建了它(尤其是别人编写的代码),那么可以以此确定它是否是一个数组或一个对象等。

下面实例化JavaScript语言中的大多数预配置对象。请注意,在字面量/原始值上使用constructor属性能够指向正确的构造函数。

<!DOCTYPE html><html lang="en"><body><script>

var myNumber = new Number('23');
var myNumberL = 23; // 字面量方式
var myString = new String('male');
var myStringL = 'male'; // 字面量方式
var myBoolean = new Boolean('true');
var myBooleanL = true; // 字面量方式
var myObject = new Object();
var myObjectL = {}; // 字面量方式
var myArray = new Array();
var myArrayL = []; // 字面量方式
var myFunction = new Function();
var myFunctionL = function () { }; // 字面量方式
var myDate = new Date();
var myRegExp = new RegExp('/./');
var myRegExpL = /./; // 字面量方式
var myError = new Error();

console.log( // 所有这些都返回true
    myNumber.constructor === Number,
    myNumberL.constructor === Number,
    myString.constructor === String,
    myStringL.constructor === String,
    myBoolean.constructor === Boolean,
    myBooleanL.constructor === Boolean,
    myObject.constructor === Object,
    myObjectL.constructor === Object,
    myArray.constructor === Array,
    myArrayL.constructor === Array,
    myFunction.constructor === Function,
    myFunctionL.constructor === Function,
    myDate.constructor === Date,
    myRegExp.constructor === RegExp,
    myRegExpL.constructor === RegExp,
    myError.constructor === Error
);

</script></body></html>

constructor属性也适用于用户自定义的构造函数。如下代码中,我们定义了一个CustomConstructor()构造函数,然后使用new关键字调用构造函数来生成一个对象。一旦创建了对象,就可以使用constructor属性了。

<!DOCTYPE html><html lang="en"><body><script>

var CustomConstructor = function CustomConstructor() { return 'Wow!'; };
var instanceOfCustomObject = new CustomConstructor();

// 输出true
console.log(instanceOfCustomObject.constructor === CustomConstructor);

// 返回CustomConstructor()函数的一个引用
// 返回 'function() { return 'Wow!'; };'
console.log(instanceOfCustomObject.constructor);

</script></body></html>

注意

  • 大家可能会感到困惑,当不返回对象时,原始值为何拥有指向构造函数的constructor属性。使用原始值的时候,依然调用了构造函数,因此原始值和构造函数依然有关系。然而,最终的结果是一个原始值。
  • 对用户自定义的构造函数表达式,如果想让constructor属性记录构造函数的实际名称,则必须给予构造函数表达式一个实际名称(如var Person = function Person(){};)。
时间: 2024-10-03 15:05:52

《JavaScript启示录》——1.18 构造函数实例都拥有指向其构造函数的Constructor属性的相关文章

《JavaScript启示录》——导读

前言 本书无关于JavaScript设计模式,也无关于JavaScript面向对象代码实现.本书的写作目的也不是鉴别JavaScript语言特点的好坏.本书并不是一本完整的参考指南.它面向的读者人群并不是编程新手或对JavaScript完全陌生的人员.同时,它也不是一本JavaScript攻略手册.关于上述这些方面的书籍都已经面世. 本书的撰写意图是通过考察原生JavaScript对象和不同环境对原生对象的支持的细微差别,来给读者展现准确的JavaScript世界观:复杂值.原始值.作用域.继承

《JavaScript启示录》——1.20 构造函数创建的实例可拥有自己独立的属性(实例属性)

1.20 构造函数创建的实例可拥有自己独立的属性(实例属性) 在JavaScript中,对象在任何时候都可以扩展(即动态属性).正如前面提到的,确切地说,JavaScript拥有易变对象(mutable object).这意味着通过构造函数创建的对象可以扩展属性. 下面的代码通过Array()构造函数创建了一个实例,然后利用其属性进行扩展. <!DOCTYPE html><html lang="en"><body><script> var

《JavaScript启示录》——1.2 JavaScript构造函数构建并返回对象实例

1.2 JavaScript构造函数构建并返回对象实例 构造函数的作用是创建多个共享特定特性和行为的对象.构造函数主要是一种用于生成对象的饼干模具,这些对象具有默认属性和属性方法. 如果说"构造函数只是一个函数",那么我会说"你是对的,除非使用new关键字来调用该函数."(如new String('foo')).如果使用new调用某函数,该函数则担任一个特殊的角色,JavaScript给予该函数特殊待遇,将该函数的this值设置为正在构建的新对象.除了这个特殊行为,

《JavaScript启示录》——1.4 用户自定义/非原生对象构造函数

1.4 用户自定义/非原生对象构造函数 正如在Person()构造函数中所看到的,我们可以创建自己的构造函数,从中可以生成不只一个,而是多个自定义对象. 下面列出了熟悉的Person()构造函数: <!DOCTYPE html><html lang="en"><body><script> var Person = function (living, age, gender) { this.living = living; this.age

《JavaScript启示录》——1.3 JavaScript原生/内置对象构造函数

1.3 JavaScript原生/内置对象构造函数 JavaScript语言包含9个原生(或内置)对象构造函数.JavaScript使用这些对象来构建JavaScript语言."构建"的意思是指,这些对象是用于表达JavaScript代码中的对象值,以及协调语言中的多个特性.因此,原生对象构造函数是多方面的,它们生成对象,但也被用于促进语言的编程约定的形成.例如,函数是Function()构造函数创建的对象,但作为构造函数,使用new关键字调用后,它们也可用于创建其他对象. 下面列出了

《JavaScript启示录》——1.5 使用new操作符实例化构造函数

1.5 使用new操作符实例化构造函数 构造函数从根本上说是用于创建预配置对象的饼干模具模板.以String()为例,这个函数在与new操作符[new String('foo') ]一起使用时会创建基于String()模板的字符串实例.让我们来看一个示例. <!DOCTYPE html><html lang="en"><body><script> var myString = new String('foo'); console.log(

《JavaScript启示录》——第1章 JavaScript对象 1.1创建对象

第1章 JavaScript对象 1.1 创建对象 在JavaScript中,对象为"王":JavaScript里的几乎所有东西都是对象或者用起来像对象.理解了对象,就能够理解JavaScript.因此,让我们来查看一下JavaScript中的对象创建. 对象只是一组有命名值(也称为属性)集合的容器.在阅读JavaScript代码之前,让我们先来推理一下.以我自己为例,我们可以用简单的语言在表格中表达"cody": 上述表格中的"cody"一词只

深入理解JavaScript系列(18):面向对象编程之ECMAScript实现_基础知识

介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35页). 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-2-oop-ecmascript-implementation/ 注:由于篇幅太长了,难免出现错误,时刻保持修正中. 在概论里,我们延伸到了ECMAScript,现在,当我们知道它OOP

Javascript单例模式的介绍和实例_javascript技巧

前言 其实和其他编程语言一样,Javascript同样拥有着很多种设计模式,比如单例模式.代理模式.观察者模式等,熟练运用Javascript的设计模式可以使我们的代码逻辑更加清晰,并且更加易于维护和重构. 本文将会介绍Javascript中的单例模式,在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象.在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个