千家信息网

JavaScript中的constructor属性怎么使用

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本篇内容介绍了"JavaScript中的constructor属性怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细
千家信息网最后更新 2025年01月24日JavaScript中的constructor属性怎么使用

本篇内容介绍了"JavaScript中的constructor属性怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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属性怎么使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

属性 函数 代码 指向 等价 内容 对象 更多 知识 实用 有趣 学有所成 接下来 事情 例子 困境 实例 实际 情况 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 榆林软件开发定制 db2数据库节点路径 青蛙数据库软件是什么 绝地求生土耳其服务器更新时间 深圳市丰巢网络技术有限公司采购 查询数据库归档位置 汕头职业技术学院网络技术 pos零售登录数据库失败 芜职计算机网络技术在哪个区 落实年度网络安全工作报告制度 中信证券软件开发待遇如何 创建名字为mydb的数据库 鸿赛互联网科技有限公司 软件开发业务质保履约义务 河南云互联网科技有限公司 图们市网络安全 数据库保护问题包括哪些方面 友邦软件开发 怀旧服如何查询服务器人口比例 博乐app软件开发 常见数据库实现安全 北京大华存储服务器价格 软件开发的相关背景材料 光遇和好友不在一个服务器怎么办 网络安全宣传周泉州 网络安全防护建议书doc下载 遍历数据库中所有的表 mac软件开发招聘网 小游戏租云服务器费用 苏州市网络安全平台
0