JavaScript对象中的constructor属性

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

比如下面的例子:


 1 // 等价于 var foo = new Array(1, 56, 34, 12);
2 var arr = [1, 56, 34, 12];
3 console.log(arr.constructor === Array); // true
4 // 等价于 var foo = new Function();
5 var Foo = function() { };
6 console.log(Foo.constructor === Function); // true
7 // 由构造函数实例化一个obj对象
8 var obj = new Foo();
9 console.log(obj.constructor === Foo); // true
10
11 // 将上面两段代码(第6,9行)合起来,就得到下面的结论
12 console.log(obj.constructor.constructor === Function); // true

但是当constructor遇到prototype时,有趣的事情就发生了。

我们知道每个函数都有一个默认的属性prototype,而这个prototype的constructor(prototype.constructor)默认指向这个函数。

如下例所示:


  1.  1 function Person(name) {
    2 this.name = name;
    3 };
    4 Person.prototype.getName = function() {
    5 return this.name;
    6 };
    7 var p = new Person("TT");
    8
    9 console.log(p.constructor === Person); // true
    10 console.log(Person.prototype.constructor === Person); // true
    11 // 将上两行代码合并就得到如下结果
    12 console.log(p.constructor.prototype.constructor === Person); // true

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

如下示例:


  1.  1 function Person(name) {
    2 this.name = name;
    3 };
    4 Person.prototype = {
    5 getName: function() {
    6 return this.name;
    7 }
    8 };
    9 var p = new Person("TT");
    10 console.log(p.constructor === Person); // false
    11 console.log(Person.prototype.constructor === Person); // false
    12 console.log(p.constructor.prototype.constructor === Person); // false

为什么呢?

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


  1. 1 Person.prototype = new Object({  //Object的实例
    2 getName: function() {
    3 return this.name;
    4 }
    5 });

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


  1.  1 function Person(name) {
    2 this.name = name;
    3 };
    4 Person.prototype = { //注意是字面量方式
    5 getName: function() {
    6 return this.name;
    7 }
    8 };
    9 var p = new Person("TT");
    10 console.log(p.constructor === Object); // true
    11 console.log(Person.prototype.constructor === Object); // true
    12 console.log(p.constructor.prototype.constructor === Object); // true

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


  1.  1 function Person(name) {
    2 this.name = name;
    3 };
    4 Person.prototype = new Object({
    5 getName: function() {
    6 return this.name;
    7 }
    8 });
    9 Person.prototype.constructor = Person; //重新指向Person
    10 var p = new Person("TT");
    11 console.log(p.constructor === Person); // true
    12 console.log(Person.prototype.constructor === Person); // true
    13 console.log(p.constructor.prototype.constructor === Person); // true

时间: 2024-10-15 13:45:15

JavaScript对象中的constructor属性的相关文章

删除一个Javascript对象中的一个属性

一个Javascript对象如下 var myObject = { "ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*" }; 想要达到的目的如下 var myObject = { "ircEvent": "PRIVMSG", "method": &qu

JavaScript对象中的属性(可写,可配置,可枚举,value,getter,setter)

JavaScript中,对象包括3个特性,分别为,可扩展性,class标识符,属性. 如果对象的可扩展性为false,则不可为对象动态的添加属性. 对象包含分为存取器属性和值属性.存取属性为 {get r(){/*函数实现*/},set r(){/*函数实现*/}} 存取器属性自身不能保存值,set相当于对对象中其他的属性进行更改.get中也可以返回其他属性的值.属性的特性值为 可写性,可配置性,value,可枚举性.存取器属性使用get,set属性来替换可写性和value. 在没有实现ES5的

为什么要设置Javascript对象prototype的constructor

最近读了一篇关于Javascript面向对象编程的文章,里面介绍了Javascript中的类,对象,属性,方法,构造函数,继承,封装,抽象和多态性.读完之后感觉受益匪浅,对Javascript有了进一步的认识.文章的地址在这里. 在讲到继承的时候,文章里面用了如下的例子 // define the Person Class function Person() {} Person.prototype.walk = function(){ alert ('I am walking!'); }; Pe

在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”

在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”. public class User { public long UserId { get; set; } public string UserName { get; set; } public string UserPwd { get; set; } public D

深入理解javascript对象系列第二篇——属性操作

× 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对象系列的第二篇——属性操作 属性查询 属性查询一般有两种方法,包括点运算符和方括号运算符 var o = { p: 'Hello World' }; o.p // "Hello World" o['p'] // "Hello World" [注意]变量中可以存在中文,因

判断JavaScript对象为null或者属性为空

http://blog.csdn.net/yiluoak_47/article/details/7766760 首先说下null与undefined区别: 对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined". null表示一个空对象指针,typeof操作会返回"object". 一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值. 1 var bj; 2 alert(b

列出JavaScript对象中的键

var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; JavaScript对象如上 var getKeys = function(obj){ var keys = []; for(var key in obj){ keys.push(key); } return keys; }

javascript 对象中的 handleEvent

在高级浏览器中,我们在绑定事件的时候 可以知道绑定一个对象,然后在这个对象中的 handleEvent 方法会自动进入指定的方法,不多说了举个例子吧!! var events = { handleEvent: function(event) { switch (event.type) { case 'touchstart': this.touchstart(event); break; case 'touchmove': this.touchmove(event); break; case 't

对JavaScript对象数组按指定属性和排序方向进行排序

引子 在以数据为中心的信息系统中,以表格形式展示数据是在常见不过的方式了.对数据进行排序是必不可少的功能.排序可以分为按单个字段排序和按多个字段不同排序方向排序.单字段排序局限性较大,不能满足用户对数据的关注点变化的需求,而多字段排序就可以较好的弥补这个缺陷. 多字段排序,实现的方式从大的层面上可以分为后端实现和前端实现. 后端排序 后端实现排序可以在数据库层面实现或者在应用程序层面实现. 数据库层面实现多字段排序非常简单,使用SQL的排序指令“Order By”即可——Order By fie