`
liuguofeng
  • 浏览: 450060 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

js constructor属性

 
阅读更多

 constructor属性始终指向创建当前对象的构造函数。比如下面例子:

var arr = [1, 56, 34, 12]; // 等价于 var foo = new Array(1, 56, 34, 12);
document.writeln(arr.constructor === Array);// true

 

在看下面的例子

var foo = new Function();
var Foo = function() { };
document.writeln(Foo.constructor === Function); // true

// 由构造函数实例化一个obj对象
var obj = new Foo();
document.writeln(obj.constructor === Foo); // true

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

 

但是当constructor遇到prototype时,有趣的事情就发生了。 
我们知道每个函数都有一个默认的属性prototype, 
而这个prototype的constructor默认指向这个函数。如下例所示: 
Java代码  
function Person(name) {   
    this.name = name;   
};   
Person.prototype.getName = function() {   
    return this.name;   
};   
var p = new Person("ZhangSan");   
document.writeln(p.constructor === Person);// true   
document.writeln(Person.prototype.constructor === Person); // true   
// 将上两行代码合并就得到如下结果   
document.writeln(p.constructor.prototype.constructor === Person); // true   

function Person(name) {
	this.name = name;
};
Person.prototype.getName = function() {
	return this.name;
};
var p = new Person("ZhangSan");
document.writeln(p.constructor === Person);// true
document.writeln(Person.prototype.constructor === Person); // true
// 将上两行代码合并就得到如下结果
document.writeln(p.constructor.prototype.constructor === Person); // true 

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

Java代码  
function Person(name) {   
    this.name = name;   
};   
Person.prototype = {   
    getName: function() {   
        return this.name;   
    }   
};   
var p = new Person("ZhangSan");   
document.writeln(p.constructor === Person);  // false   
document.writeln(Person.prototype.constructor === Person); // false   
document.writeln(p.constructor.prototype.constructor === Person); // false  

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

为什么呢? 
原来是因为覆盖Person.prototype时,等价于进行如下代码操作: 

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

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

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

Java代码  
function Person(name) {   
    this.name = name;   
};   
Person.prototype = {   
    getName: function() {   
        return this.name;   
    }   
};   
var p = new Person("ZhangSan");   
document.writeln(p.constructor === Object);  // true   
document.writeln(Person.prototype.constructor === Object); // true   
document.writeln(p.constructor.prototype.constructor === Object); // true   

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

怎么修正这种问题呢?方法也很简单,重新覆盖Person.prototype.constructor即可: 

Java代码  
function Person(name) {   
    this.name = name;   
};   
Person.prototype = new Object({   
    getName: function() {   
        return this.name;   
    }   
});   
Person.prototype.constructor = Person;   
  
// 如此也可以   
/*  
Person.prototype = new Object({  
    constructor:Person,  
    getName: function() {  
        return this.name;  
    }  
});  
Person.prototype = {  
    constructor:Person,  
    getName: function() {  
        return this.name;  
    }  
};  
*/  
  
var p = new Person("ZhangSan");   
document.writeln(p.constructor === Person);  // true   
document.writeln(Person.prototype.constructor === Person); // true   
document.writeln(p.constructor.prototype.constructor === Person); // true   

 

分享到:
评论
3 楼 liuguofeng 2012-05-23  
Person
S631887934 写道
学习中。。 有个问题想请教楼主
为什么要加上Person.prototype.constructor = Person;
除了让constructor重新指向Person外,如果不修改会对功能方面有什么其他影响吗?

你去了解一下运算符,你就清楚了
2 楼 S631887934 2012-05-22  
学习中。。 有个问题想请教楼主
为什么要加上Person.prototype.constructor = Person;
除了让constructor重新指向Person外,如果不修改会对功能方面有什么其他影响吗?
1 楼 hhzhaoheng 2012-05-17  
thanks for your code and your efforts

相关推荐

    JavaScript的constructor属性[文].pdf

    JavaScript constructor 属性在类型检查中的应用 在 JavaScript 中,constructor 属性是一种非常有用的工具,可以帮助我们检查变量的类型。Constructor 属性可以帮助我们解决 typeof 函数无法解决的问题,即无法...

    javascript new后的constructor属性.docx

    // prototype对象有一个constructor属性,指向BB这个函数。 console.log(b.constructor === BB.prototype.constructor); // true ``` 这段代码说明了`constructor`属性的基本作用: 1. **原型链上的引用**:`...

    JavaScript精炼之构造函数 Constructor及Constructor属性详解

    对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)

    Javascript的构造函数和constructor属性

    真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让...

    JavaScript中constructor()方法的使用简介

    首先,constructor属性存在于所有的JavaScript对象之中,它指向创建当前对象的构造函数。通过这个属性,我们可以获得对象的创建来源,同时也可以用来判断对象的类型。例如,我们创建了一个新对象后,可以通过...

    JavaScript类和继承 constructor属性

    在JavaScript中,constructor属性是一个非常重要的基础概念,它出现在类(Class)和继承(Inheritance)的实现中。constructor属性主要用于识别创建某个对象的构造函数。通常情况下,构造函数的prototype对象会拥有...

    javascript new后的constructor属性

    prototype对象有constructor属性指向BB这个函数;所以alert(b.constructor==BB.prototype.constructor) //true 这里的“有了”的执行过程是先查看b有没有此属性让后去查看prototype里的属性值,不是简单的A=...

    深化浅析JavaScript中的constructor_.docx

    constructor 属性是 JavaScript 中的一种特殊属性,它返回对创建此对象的数组函数的引用。下面我们来深入浅析 JavaScript 中的 constructor。 constructor 属性是一个非标准的 JavaScript 属性,但是在大多数...

    JS:typeof instanceof constructor prototype区别

    在JavaScript(JS)编程语言中,确定变量或对象的类型是一项基本且重要的任务。这不仅有助于理解代码的行为,还能在调试、数据验证以及实现特定功能时提供帮助。本文将深入探讨四种常用的方法来识别和判断JavaScript...

    理解Javascript_11_constructor实现原理

    在JavaScript中,constructor属性是对象模型的一个重要部分,它用于指出创建对象的构造函数。在理解了对象模型之后,我们可以更深入地探讨constructor属性的实现原理。 首先,constructor属性可以被看作是对象的...

    JavaScript中的prototype和constructor简明总结

    在 JavaScript 中,几乎所有的数据类型都有一个 constructor 属性,它指向创建这个数据的构造函数。而 prototype 则是函数所特有的属性,它让函数可以被用作构造器来创建实例,同时这些实例可以共享相同的方法和属性...

    js-constructor:JavaScript

    `constructor`属性被重置,以便正确地引用`Student`构造函数。 总结,JavaScript中的构造函数是创建和初始化对象的关键工具。通过定义构造函数,我们可以创建自定义的类型,设置对象的属性和方法,并实现面向对象的...

    JS 操作Array数组的方法及属性实例解析

    然而,由于JavaScript的动态性,constructor属性是可以被修改的,所以在实际开发中,更推荐使用`Array.isArray()`方法来确定一个对象是否为数组。 此外,Array对象还包含许多其他的方法,如`push()`、`pop()`、`...

    深入浅析JavaScript中的constructor

    在JavaScript中,`constructor`属性是一个非常重要的概念,它与对象和类的构造函数紧密相关。构造函数是一种特殊类型的函数,通常用于初始化新创建的对象。当我们谈论`constructor`时,我们指的是一个对象实例的`...

    js遍历属性 以及 js prototype 和继承

    在JavaScript中,遍历属性、理解`prototype`和掌握继承机制是编程中不可或缺的基本技能。本文将深入探讨这些概念,并通过实例来加深理解。 首先,让我们来看如何遍历JavaScript对象的属性。JavaScript提供了多种...

Global site tag (gtag.js) - Google Analytics