constructor属性

constructor 定义

constructor属性 返回对创建此对象的数组函数的引用。

constructor 语法

object.constructor

constructor 始终指向创建当前对象的构造函数。

备注 必需的 object 是一个对象或函数的名称。 constructor 属性是每个具有原型的对象的原型成员。 这包括除 Global 和 Math 对象之外的所有内部 JavaScript 对象。constructor 属性包含了对某种函数的引用,此种函数构造了特定对象的实例。

example

null && undefined

null 和 undefined 是没有constructor属性的

var aa ;
console.log(aa.constructor); // Cannot read property 'constructor' of undefined

var bb = null;
console.log(bb.constructor); // Cannot read property 'constructor' of null

基本数据类型的constructor

number.constructor

var num2 = new Number(1);  
console.log(num2.constructor); // function Number() { [native code] }
console.log(num2.constructor === Number); // true

var num1 = 1;  // 等价于 var num1 = new Number(1) , 所以下面结果成立
console.log(num1.constructor); // function Number() { [native code] }
console.log(num1.constructor === Number); // true

数字的字面量创建方式能取到constructor属性,是因为等价于用new方法构造出来的数字对象。 同上,数字类型,其他基本类型如字符串、布尔、数组等都一样。

string.constructor

var str = "hello";
console.log(str.constructor);  // function String() { [native code] }
console.log(str.constructor === String);  // true

boolean.constructor

var d = true;
console.log(d.constructor);  // function Boolean() { [native code] }
console.log(d.constructor === Boolean);  // true

array.constructor

var b = [1,2];  
console.log(b.constructor);  // function Array() { [native code] }
console.log(b.constructor === Array);  // true

object.constructor

var c = {};
console.log(c.constructor);  // function Object() { [native code] }
console.log(c.constructor === Object);  // true

data.constructor

var g = new Date();
console.log(g.constructor); // function Date() { [native code] }
console.log(g.constructor === Date); // function Date() { [native code] }

regexp.constructor

var h = /\d/;
console.log(h.constructor); // function RegExp() { [native code] }
console.log(h.constructor === RegExp); // true

function.constructor

 var h = function() {
 	var hello = "hello";
 };
 console.log(h.constructor); // function Function() { [native code] }
 console.log(h.constructor === Function); // true

构造函数的constructor

实例化构造函数的对象的constructor指向其构造函数

function F(){ }
var obj = new F();

console.log(obj.constructor === F) // true
console.log(F.constructor === Function) //true
//将上面两段代码合起来,就得到下面的结论
 console.log(obj.constructor.constructor === Function); // true

proptotype.constructor

每个函数都有一个默认的属性prototype,而这个prototype的constructor默认指向这个函数。

function Person(name) {
    this.name = name;
};
Person.prototype.getName = function() {
    return this.name;
};
var p = new Person("ZhangSan");

console.log(p.constructor === Person);  // true
console.log(Person.prototype.constructor === Person); // true
// 将上两行代码合并就得到如下结果
console.log(p.constructor.prototype.constructor === Person); // true

当时当我们重新定义函数的prototype时(注意:和上例的区别,这里不是修改而是覆盖), constructor的行为就有点奇怪了,如下示例:

function Person(name) {
    this.name = name;
};
Person.prototype = {
    getName: function() {
        return this.name;
    }
};
var p = new Person("ZhangSan");

console.log(p.constructor === Person);  // false
console.log(Person.prototype.constructor === Person); // false
console.log(p.constructor.prototype.constructor === Person); // false

因为覆盖Person.prototype时,等价于进行如下代码操作:

Person.prototype = new Object({
    getName: function() {
        return this.name;
    }
});

而constructor始终指向创建自身的构造函数,所以此时Person.prototype.constructor === Object,即是:

function Person(name) {
    this.name = name;
};
Person.prototype = {
    getName: function() {
        return this.name;
    }
};
var p = new Person("ZhangSan");

console.log(p.constructor === Object);  // true
console.log(Person.prototype.constructor === Object); // true
console.log(p.constructor.prototype.constructor === Object); // true

怎么修正这种问题呢?重新覆盖Person.prototype.constructor即可:

function Person(name) {
    this.name = name;
};
Person.prototype = new Object({
    getName: function() {
        return this.name;
    }
});
Person.prototype.constructor = Person;
var p = new Person("ZhangSan");

console.log(p.constructor === Person);  // true
console.log(Person.prototype.constructor === Person); // true
console.log(p.constructor.prototype.constructor === Person); // true

或者:

function Person(name) {
    this.name = name;
};
Person.prototype = {
    constructor: Person,
    getName: function() {
        return this.name;
    }
};

var p = new Person("ZhangSan");

console.log(p.constructor === Person);  // true
console.log(Person.prototype.constructor === Person); // true
console.log(p.constructor.prototype.constructor === Person); // true