`

javascript constructor属性 转载

阅读更多

原文地址:      http://developer.51cto.com/art/200907/134913.htm

 

本文介绍了JavaScript里面的constructor属性。这个属性是理解JavaScript类和继承的重要基础。

 

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

 

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

 

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

我们知道每个函数都有一个默认的属性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 
 

 

分享到:
评论

相关推荐

    JavaScript的constructor属性[文].pdf

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

    javascript new后的constructor属性.docx

    ### JavaScript中的`new`操作与`constructor`属性详解 #### 一、`new`操作符的理解 在JavaScript中,`new`操作符被用于创建一个由构造函数定义的新实例对象。当使用`new`关键字调用一个构造函数时,会执行以下步骤...

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

    在JavaScript编程语言中,constructor()方法是一个非常重要的概念,它属于对象的一个属性,用于指明创建该对象的构造函数。对初学者来说,理解constructor()方法是学习JavaScript对象和原型链的基础。 首先,...

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

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

    JavaScript类和继承 constructor属性

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

    Javascript的构造函数和constructor属性

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

    深化浅析JavaScript中的constructor_.docx

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

    javascript new后的constructor属性

    js对象生成时: 如:function BB(a){...这里的“有了”的执行过程是先查看b有没有此属性让后去查看prototype里的属性值,不是简单的A=B:如添加:b.constructor=”ccc”; 执行:alert(b.constructor==BB.prototype.co

    JavaScript中的prototype和constructor简明总结

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

    理解Javascript_11_constructor实现原理

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

    深入浅析JavaScript中的constructor

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

    js-konstr:JavaScriptConstructor

    总结一下,JavaScriptConstructor是JavaScript中创建对象的机制,通过构造函数我们可以定义对象的属性和方法。PARCEL作为前端构建工具,简化了开发流程,提供了代码打包和本地服务器的功能。"js-konstr-main"很可能...

    JavaScript constructor和instanceof,JSOO中的一对欢喜冤家

    在这个机制中,`constructor` 和 `instanceof` 是两个关键的概念,它们在JavaScript的面向对象编程中起着至关重要的作用。 `constructor` 是一个特殊属性,通常存在于对象的原型链中,它指向创建该对象的函数。当你...

    gcc 函数属性 attribute ((constructor))使用demo

    gcc 函数属性 attribute ((constructor))使用demo demo演示了gpio_init(void) 和 key_init(void)如何设置__attribute__ ((constructor)) 属性,同时演示了添加key.c文件的不需要修改main.c的方法,此方法能减少对...

    JavaScript中几个重要的属性(this、constructor、prototype)介绍

    在JavaScript编程中,`this`、`constructor`和`prototype`是三个核心概念,它们在实现对象的创建和继承机制中扮演着至关重要的角色。理解这些概念对于深入学习JavaScript语言和编写高质量的面向对象代码至关重要。 ...

Global site tag (gtag.js) - Google Analytics