JavaScript Object​.prototype属性

**Object.prototype** 属性表示 Object的原型对象。

1、属性特性

Object.prototype 属性的属性特性: 类型
writable boolean true
enumerable boolean false
configurable boolean true

2、描述

几乎所有的 JavaScript 对象都是 Object的实例;一个典型的对象继承了Object.prototype的属性(包括方法),尽管这些属性可能被遮蔽(亦称为覆盖)。但是有时候可能故意创建不具有典型原型链继承的对象,比如通过Object.create(null)方法创建的对象,或者通过Object.setPrototypeOf方法改变原型链。
改变Object原型,会通过原型链改变所有对象;除非在原型链中进一步覆盖受这些变化影响的属性和方法。这提供了一个非常强大的、但有潜在危险的机制来覆盖或扩展对象行为。

3、属性

3.1 Object​.prototype​.constructor

返回创建实例对象的 Object 构造函数的引用。注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串。对原始类型来说,如1true"test",该值只可读。

      var o = {};
      console.log(o.constructor === Object); // true
      var o = new Object();
      console.log(o.constructor === Object); // true
      var a = [];
      console.log(a.constructor === Array); // true
      var a = new Array();
      console.log(a.constructor === Array); // true
      var n = new Number(3);
      console.log(n.constructor === Number); // true

上面实例中,所有对象都会从它的原型上继承一个 constructor 属性。
我们也可以改变对象的constructor属性,但是并不安全。
比如我们给子类添加链式调用的功能,constructor属性指向不对,将报错。
举个🌰~~

      function Parent() {}
      function CreatedConstructor() {}
      CreatedConstructor.prototype = Object.create(Parent.prototype);
      //  CreatedConstructor.prototype.constructor = CreatedConstructor; // (第四行)set right constructor for further using
      CreatedConstructor.prototype.create = function() {
        return new this.constructor();
      };
      console.log(CreatedConstructor.prototype.constructor); //ƒ Parent() {}
      new CreatedConstructor().create().create();

上述例子,我们修改了CreatedConstructor的prototype指向,在CreatedConstructor的prototype上创建create方法 。create方法返回当前实例的构造函数,实现链式调用。注释掉第四行,发现报错,只能调用一次create方法。

constructor指向Parent

放开第四行,设置正确的constructor指向,就可以实现了。
constructor指向CreatedConstructor

总结
手动设置或更新构造函数可能会导致不同且有时令人困惑的后果。为了防止它,只需在每个特定情况下定义构造函数的角色。在大多数情况下,不使用构造函数,并且不需要重新分配构造函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,279评论 0 6
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,581评论 0 21
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 1,281评论 0 4
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 1,110评论 0 4
  • 此刻,我正坐在火车站旁边的麦当劳里等着晚上的火车,今晚在这里中转,再次踏上离乡的旅程。 音响里正放着费翔的《故乡的...
    胡八毛阅读 288评论 0 3

友情链接更多精彩内容